Неожиданное поведение bash скрипта в части проверки кода возврата
подскажите, пожалуйста. Есть утилита, которая в определенном случае возвращает код 70. Мой код по обработке такой ситуации не работает, в чем я неправ?
kesl-control --start-task 1 &> /dev/null
if [[ $? == 0 ]]; then
echo 1
elif [[ $? == 70 ]]; then
echo 2
else
echo 3
fi
По идее если код возврата 70, то мой скрипт должен выводить 2, но он в таком случае всегда выводит 3. Что я делаю не так?
Ответы (2 шт):
$? - это код завершения последней команды. Сначала он равен тому, что возвращает kesl-control. Следом выполняется проверка условия в if и $? становится другим - в зависимости от результата выполнения условия. Чтобы зафиксировать результат kesl-control и сделать несколько проверок именно по нему, нужно сразу присвоить его переменной. Например, так:
(exit 70)
result=$?
if [[ $result == 0 ]]; then
echo 1
elif [[ $result == 70 ]]; then
echo 2
else
echo 3
fi
2
Проверить такое поведение можно таким простым образом:
(exit 45)
echo $?
echo $?
45
0
Сначала выводится код завершения (exit 45) - он равен 45, как и ожидалось. Но после вывода на экран команда echo возвращает код уже своего успешного завершения - 0, что и печатается во втором echo.
Я бы посоветовал использовать case это удобнее и выглядит лучше:
kesl-control --start-task 1 &> /dev/null
case $? in
0) echo 1;;
70) echo 2;;
*) echo 3;;
esac