Есть ли способ проверить, есть ли ошибка при выполнении команды?
Пример:
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
}
Я уже пытался это сделать, но, похоже, это не работает. Я не как это сделать.
Возвращаемое значение сохраняется в $?
. 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
. ]
$? должен содержать статус выхода предыдущей команды, который должен быть нулевым для отсутствия ошибок.
Итак, что-то вроде;
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, что завершит работу сценария, если предыдущая команда не удалась.)
Если вам нужно только знать, была ли команда выполнена успешно или нет, не пытайтесь тестировать $?
, просто протестируйте команду напрямую. Например :
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
более подробно.
Следует отметить, что тип захода на посадку 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 )
Для защиты от ошибок ваши команды:
execute [INVOKING-FUNCTION] [COMMAND]
execute () {
error=$($2 2>&1 >/dev/null)
if [ $? -ne 0 ]; then
echo "$1: $error"
exit 1
fi
}
Вдохновили в Бережливом производстве:
Как упоминалось во многих других ответах, можно выполнить простой тест $?
, например
if [ $? -eq 0 ]; then something; fi
Если вы хотите проверить, не завершилась ли команда , вы можете использовать более короткая версия в bash
(но, возможно, излишняя) выглядит следующим образом:
if (($?)); then something; fi
Это работает с использованием арифметического режима (( ))
, поэтому, если команда вернула success
, то есть $? = 0
, тогда test оценивает ((0))
, который проверяет как false
, в противном случае он вернет true
.
Чтобы проверить успеха , вы можете использовать:
if ! (($?)); then something; fi
, но это уже не намного короче, чем в первом примере.