Запустите весь сценарий, зарегистрируйте все ошибки, но не завершайте работу с ошибкой до конца в AIX
Так что это может быть немного сложным, что я пытаюсь сделать, но терпеть меня. Я пытаюсь запустить скрипт, с несколькими вложенными if
заявления. if
Утверждения в основном определяют, существует ли что-то, если нет, то я хочу, чтобы это записало ошибку. Я не хочу, чтобы сценарий завершался с ошибкой до конца, когда он должен показать, какие части всего сценария не были выполнены успешно. Если во всем сценарии не было ошибок, я бы хотел, чтобы в нем было написано "Хорошо идти" или что-то в этом роде.
Это то, что я имею до сих пор.
#Checks if foo exists as a directory
if [ -d "/foo" ]; then
#foo exists as a directory
echo "foo exists"
else
#foo does not exist
echo "foo does not exist."
exit 1
fi
#If the directory above exists create the user
id -u bar > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "bar user exists"
else
echo "bar user doesn't exist"
exit 1
fi
Теперь это завершится, если один из них даст код выхода 1, но я хочу запустить их оба, и в нижней части сценария указать мне, какая часть вышла из строя, а затем выйти с 0 или 1 основано, если что-то не получилось Я думал написать это как
if [ -d /foo && -d /bar ];
then
echo "All's good"
exit 0
elif [ -d /foo ];
then
echo "A is fine!"
elif [ -d /bar ];
echo "B is fine"
elif [ ! -d /foo ];
echo "A is not fine"
elif [ ! -d /bar ];
echo "B is not fine"
fi
Проблема в том, что я не думаю, что это очень элегантно, и я не могу просто написать if
утверждение, как это. Я думал об использовании trap
операторы, вложенные if
подсчитать, сколько ошибок получит скрипт и присвоить его переменной. Проблема в том, что ни один из них не кажется подходящим, так как я должен был бы либо кодировать всю вещь как trap
и с if
Утверждение, что я попадаю в ту же проблему, что и здесь, и эта переменная приводит меня к функциональности, которая есть в Linux, но в AIX нет, именно об этом я и пишу.
1 ответ
Сделайте для него функцию, которая возвращает количество ошибок:
check_conditions() {
errors=0
if [ -d /foo ]; then
echo "A is fine!"
else
echo "A is not fine"
(( errors = errors + 1 ))
fi
if [ -d /bar ]; then
echo "B is fine"
else
echo "B is not fine"
(( errors = errors + 1 ))
fi
if [ ${errors} -eq 0 ]; then
echo "All's good"
fi
return ${errors}
}
# main
check_conditions
nr_errors=$?
if [ ${nr_errors} -eq 0 ]; then
echo "Good to go"
else
echo "O dear, ${nr_errors} errors found"
fi
exit ${nr_errors}
Когда у вас много или dirs, вы можете сделать другую функцию, обрабатывающую dirs, или проверить dirs в цикле for dir in /foo /bar; do
,
Запустите код с помощью bash или ksh.