Как проверить, успешно ли выполнена команда?

Есть ли способ проверить, есть ли ошибка при выполнении команды?

Пример:

test1=`sed -i "/:@/c connection.url=jdbc:oracle:thin:@$ip:1521:$dataBase" $search`
valid $test1

function valid () {
  if $test -eq 1; then
    echo "OK"
    else echo "ERROR" 
  fi
}

Я уже пытался это сделать, но, похоже, это не работает. Я не как это сделать.

244
задан 7 March 2011 в 16:41

8 ответов

Возвращаемое значение сохраняется в $?. 0 указывает на успех, другие указывают на ошибку.

some_command
if [ $? -eq 0 ]; then
    echo OK
else
    echo FAIL
fi

Как и любое другое текстовое значение, вы можете сохранить его в переменной для будущего сравнения:

some_command
retval=$?
do_something $retval
if [ $retval -ne 0 ]; then
    echo "Return code was not zero but $retval"
fi

Для возможных операторов сравнения см. man test . ]

0
ответ дан 7 March 2011 в 16:41

$? должен содержать статус выхода предыдущей команды, который должен быть нулевым для отсутствия ошибок.

Итак, что-то вроде;

cd /nonexistant
if [ $? -ne 0 ]
then
    echo failed
else
    echo success!
fi

для большинства случаев проще использовать & amp; & amp; построить цепочку команд, которые должны зависеть друг от друга. Поэтому cd /nonexistant && echo success! не будет не отражать успех, поскольку команда прерывается до & amp; & amp; Следствием этого является ||, где cd /nonexistant || echo fail будет эхо-сбой из-за сбоя cd. (это становится полезным, если вы используете что-то вроде || exit, что завершит работу сценария, если предыдущая команда не удалась.)

0
ответ дан 7 March 2011 в 16:41

Если вам нужно только знать, была ли команда выполнена успешно или нет, не пытайтесь тестировать $?, просто протестируйте команду напрямую. Например :

if some_command; then
    printf 'some_command succeeded\n'
else
    printf 'some_command failed\n'
fi

И присвоение вывода переменной не меняет возвращаемого значения (хорошо, если только он не ведет себя по-разному, когда stdout, конечно, не является терминалом).

if output=$(some_command); then
    printf 'some_command succeded, the output was «%s»\n' "$output"
fi

http://mywiki.wooledge.org/BashGuide/TestsAndConditionals объясняет if более подробно.

0
ответ дан 7 March 2011 в 16:41
command && echo $? || echo $?
0
ответ дан 7 March 2011 в 16:41

Следует отметить, что тип захода на посадку if...then...fi и && / || связан со статусом выхода, возвращаемым командой, которую мы хотим проверить (0 в случае успеха); однако некоторые команды не возвращают ненулевой статус выхода, если команда не выполнена или не может обработать ввод. Это означает, что обычный подход if и && / || не будет работать для этих конкретных команд.

Например, в Linux GNU file по-прежнему завершается с 0, если он получил несуществующий файл в качестве аргумента и find не может найти указанный файл пользователем.

$ find . -name "not_existing_file"                                          
$ echo $?
0
$ file ./not_existing_file                                                  
./not_existing_file: cannot open `./not_existing_file' (No such file or directory)
$ echo $?
0

В таких случаях одним из возможных способов справиться с ситуацией является чтение сообщений stderr / stdin, например, те, которые возвращаются командой file, или анализируют вывод команды, как в find. Для этой цели можно использовать оператор case.

$ file ./doesntexist  | while IFS= read -r output; do                                                                                                                  
> case "$output" in 
> *"No such file or directory"*) printf "%s\n" "This will show up if failed";;
> *) printf "%s\n" "This will show up if succeeded" ;;
> esac
> done
This will show up if failed

$ find . -name "doesn'texist" | if ! read IFS= out; then echo "File not found"; fi                                                                                     
File not found

(Это репост моего собственного ответа на вопрос, связанный с , на unix.stackexchange.com )

0
ответ дан 7 March 2011 в 16:41

Для защиты от ошибок ваши команды:

execute [INVOKING-FUNCTION] [COMMAND]

execute () {
    error=$($2 2>&1 >/dev/null)

    if [ $? -ne 0 ]; then
        echo "$1: $error"
        exit 1
    fi
}

Вдохновили в Бережливом производстве:

0
ответ дан 7 March 2011 в 16:41
command && echo OK || echo Failed
0
ответ дан 7 March 2011 в 16:41

Как упоминалось во многих других ответах, можно выполнить простой тест $?, например

if [ $? -eq 0 ]; then something; fi

Если вы хотите проверить, не завершилась ли команда , вы можете использовать более короткая версия в bash (но, возможно, излишняя) выглядит следующим образом:

if (($?)); then something; fi

Это работает с использованием арифметического режима (( )), поэтому, если команда вернула success, то есть $? = 0, тогда test оценивает ((0)), который проверяет как false, в противном случае он вернет true.

Чтобы проверить успеха , вы можете использовать:

if ! (($?)); then something; fi

, но это уже не намного короче, чем в первом примере.

0
ответ дан 7 March 2011 в 16:41

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

Похожие вопросы: