Неожиданное поведение 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.

→ Ссылка
Автор решения: Ivan

Я бы посоветовал использовать case это удобнее и выглядит лучше:

kesl-control --start-task 1 &> /dev/null
case $? in
     0) echo 1;;
    70) echo 2;;
     *) echo 3;;
esac
→ Ссылка