Есть ли способ проверить, есть ли ошибка при выполнении команды?
Пример
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
.
Если вам нужно только узнать, выполнилась ли команда или нет, не заморачивайтесь с проверкой $?
, просто проверьте команду напрямую. Например:
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
более подробно.
command && echo OK || echo Failed
$? должен содержать статус выхода из предыдущей команды, который должен быть равен нулю при отсутствии ошибки.
Таким образом, что-то вроде;
cd /nonexistant
if [ $? -ne 0 ]
then
echo failed
else
echo success!
fi
В большинстве случаев проще использовать конструкцию && для цепочки команд, которые должны зависеть друг от друга. Так cd /nonexistant && echo success!
не выдаст эхо успеха, потому что команда обрывается перед &&. Следствием этого является ||, где cd /nonexistant || echo fail
будет эхо неудачи, потому что cd не удалось. (Это становится полезным, если вы используете что-то вроде ||exit, который завершит сценарий, если предыдущая команда не выполнилась).
Следует отметить, что если...то...фи
и &АМП;&
/||
тип подхода рассматривается статус выхода возвращается по команде мы хотим протестировать( 0 в случае успеха ); однако, некоторые команды Дон'т вернуть ненулевой статус выхода, если команда не выполнена или не мог'т бороться с входным сигналом. Это означает, что обычный если
и &АМП;& подходы
/||
выиграл't работа для тех или иных команд.
Например, на файл Linux ГНУ `` еще выходы с 0, если он получил несуществующий файл в качестве аргумента и "найти" не мог'т найти пользователя файл, указанный.
$ 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
В таких случаях одним из возможных способов, мы могли бы справиться с ситуацией, читая стандартный вывод
сообщения/стандартный ввод
, например, те, которые возвращаются "файл" команду, или парсить вывод команды как в Найти
. Для этой цели, "дело" заявление может быть использовано.
$ 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 )
Как уже упоминалось в других ответов, простой тест $?
будет делать, как это
if [ $? -eq 0 ]; then something; fi
Если вы хотите проверить, если команда не, вы можете использовать более короткие версии в Баш
(но, возможно, перебор) следующим образом:
if (($?)); then something; fi
Это работает с помощью (( ))
арифметика режиме, так что если команда вернула успехов
, т. е. $? = 0
, то тест оценивается как ((0))
, который проверяет, как "ложь", в противном случае он возвращает значение true
.
Для проверки на ** успех, вы могли бы использовать:
if ! (($?)); then something; fi
но это's уже не намного короче, чем в первом примере.
Для ошибок команды:
execute [INVOKING-FUNCTION] [COMMAND]
execute () {
error=$($2 2>&1 >/dev/null)
if [ $? -ne 0 ]; then
echo "$1: $error"
exit 1
fi
}
Вдохновение в бережливом производстве: