Запустите весь сценарий, зарегистрируйте все ошибки, но не завершайте работу с ошибкой до конца в 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.

Другие вопросы по тегам