Подтвердить что ты не робот

Как проверить, $? не равен нулю в сценариях unix shell?

У меня есть script, который использует тестовую команду, чтобы проверить, не равен ли $? (код возврата последней выполненной команды) нулю. Код выглядит следующим образом: -

$? - это статус выхода последней выполненной команды.

if (test $? -ne 0)
then
//statements//
fi

Однако этот способ проверки не работает для строк как получение синтаксической ошибки. Пожалуйста, предложите подходящую альтернативу этому.

4b9b3361

Ответ 1

Сначала поместите его в переменную, а затем попробуйте протестировать его, как показано ниже.

ret=$?
if [ $ret -ne 0 ]; then
        echo "In If"
else
        echo "In Else"
fi

Это должно помочь.


Изменить: Если вышеуказанное не работает должным образом, возможно, что вы не используете $? в нужном месте. Это должна быть следующая строка после команды, для которой вам нужно уловить статус возврата. Даже если есть какая-либо другая единственная команда между мишенью и вы поймаете ее статус возврата, вы будете получать return_status этой промежуточной команды, а не ту, которую вы ожидаете.

Ответ 2

Я не могу поверить, что никто не упоминал об этом почти через 4 года после того, как этот вопрос был задан. Вам действительно не нужно тестировать, если $? не 0. Оболочка предоставляет && и ||, поэтому вы можете легко разветвляться на основе неявного результата этого теста.

Например:

some_command && {
    # executes this block of code,
    # if some_command would result in:  $? -eq 0
} || {
    # executes this block of code,
    # if some_command would result in:  $? -ne 0
}

Вы можете удалить ветвь, в зависимости от того, что вы хотите. Поэтому, если вы просто хотите протестировать отказ (т.е. $? -ne 0):

some_command_returning_nonzero || {
    # executes this block of code when:     $? -ne 0
    # and nothing if the command succeeds:  $? -eq 0
}

Однако код, который вы предоставили в вопросе, работает, как есть. Я смущен, что вы получили синтаксические ошибки и пришли к выводу, что $? является строкой. Скорее всего, ошибочный код, вызывающий синтаксическую ошибку, не был задан. Это особенно очевидно, потому что вы утверждаете, что ни одно другое решение не работает. Когда это произойдет, вы должны переоценить свои предположения.

NB: приведенный выше код может привести к запутывающим результатам, если код внутри фигурных скобок возвращает ошибку. В этом случае просто используйте команду if, например:

if some_command; then
    # executes this block of code,
    # if some_command would result in:  $? -eq 0
else
    # executes this block of code,
    # if some_command would result in:  $? -ne 0
fi

Ответ 3

Попробуйте выполнить это после выполнения script:

if [ $? -ne 0 ];
then
//statements//
fi

Надеюсь, это поможет... Приветствия!

Ответ 4

Я не знаю, как вы получили строку в $?, но вы можете сделать:

if [[ "x$?" == "x0" ]]; then
   echo good
fi

Ответ 5

Это решение, которое придумало для аналогичной проблемы

exit_status () {
if [ $? = 0 ]
then
    true
else
    false
fi
}

использование:

do-command exit_status && echo "worked" || echo "didnt work"

Ответ 6

<run your last command on this line>
a=${?}
if [ ${a} -ne 0 ]; then echo "do something"; fi

используйте любую команду, которую вы хотите использовать, вместо команды echo "do something"

Ответ 7

if [ $var1 != $var2 ] 
then 
echo "$var1"
else 
echo "$var2"
fi

Ответ 8

function assert_exit_code {
    rc=$?; if [[ $rc != 0 ]]; then echo "$1" 1>&2; fi
}

...

execute.sh

assert_exit_code "execute.sh has failed"

Ответ 9

поместите set -o pipefail в начале любого script, чтобы вернуть какой-либо сбой

вы можете сделать это, и тест не удастся, но тройник не делает. По умолчанию $? просто успешно выполняет последние команды, в этом случае команда "tee"

test | tee /tmp/dump
[ $? -ne 0 ] && echo "failed"