Linux bash exit code if

How to exit if a command failed? [duplicate]

I am a noob in shell-scripting. I want to print a message and exit my script if a command fails. I’ve tried:

but it does not work. It keeps executing the instructions following this line in the script. I’m using Ubuntu and bash.

Did you intend the unclosed quote to be a syntax error that would cause fail/exit? if not, you should close the quote in your example.

9 Answers 9

Since you want to print the message and exit only when the command fails ( exits with non-zero value) you need a || not an && .

will run cmd2 when cmd1 succeeds(exit value 0 ). Where as

will run cmd2 when cmd1 fails(exit value non-zero).

Using ( ) makes the command inside them run in a sub-shell and calling a exit from there causes you to exit the sub-shell and not your original shell, hence execution continues in your original shell.

The last two changes are required by bash.

It does appear to be «reversed». If a function «succeeds» it returns 0 and if it «fails» it returns non-zero therefore && might be expected to evaluate when the first half returned non-zero. That does not mean the answer above is incorrect — no it is correct. && and || in scripts work based on success not on the return value.

It seems reversed, but read it out and it makes sense: «do this command (successfully)» OR «print this error and exit»

Читайте также:  Процесс в linux и windows

The logic behind it is that the language uses short-circuit evaluation (SCE). With SCE, f the expression is of the form «p OR q», and p is evaluated to be true, then there is no reason to even look at q. If the expression is of the form «p AND q», and p is evaluated to be false, there is no reason to look at q. The reason for this is two-fold: 1) its faster, for obvious reasons and 2) it avoids certain kinds of errors (for example: «if x!=0 AND 10/x > 5» will crash if there is no SCE). The ability to use it in the command line like this is a happy side-effect.

Источник

Команда exit в Bash и коды выхода

Часто при написании сценариев Bash вам необходимо завершить сценарий при выполнении определенного условия или выполнить действие на основе кода выхода команды.

В этой статье мы рассмотрим встроенную команду exit Bash и статусы выхода выполненных команд.

Статус выхода

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

По соглашению нулевой код выхода указывает, что команда завершилась успешно, а ненулевое значение означает, что произошла ошибка.

Специальная переменная $? возвращает статус выхода последней выполненной команды:

Команда date завершена успешно, код выхода равен нулю:

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

ls /nonexisting_dir &> /dev/nullecho $?

Код состояния можно использовать для выяснения причины сбоя команды. На странице руководства каждой команды содержится информация о кодах выхода.

При выполнении многокомандного конвейера статус выхода конвейера соответствует состоянию последней команды:

sudo tcpdump -n -l | tee file.outecho $?

В приведенном выше примере echo $? напечатает код выхода команды tee .

Читайте также:  Astra linux снять образ системы

Команда exit

Команда exit закрывает оболочку со статусом N Он имеет следующий синтаксис:

Если N не задано, код состояния выхода — это код последней выполненной команды.

При использовании в сценариях оболочки значение, указанное в качестве аргумента команды exit возвращается оболочке как код выхода.

Примеры

Статус выхода команд может использоваться в условных командах, таких как if . В следующем примере grep завершит работу с нулем (что означает истину в сценариях оболочки), если «строка поиска» найдена в filename :

if grep -q "search-string" filename then echo "String found." else echo "String not found." fi 

При запуске списка команд, разделенных && (И) или || (ИЛИ), статус выхода команды определяет, будет ли выполнена следующая команда в списке. Здесь команда mkdir будет выполнена, только если cd вернет ноль:

cd /opt/code && mkdir project

Если сценарий завершается exit без указания параметра, код выхода из сценария — это код последней команды, выполненной в сценарии.

#!/bin/bash echo "doing stuff. " exit 

Использование только exit — это то же самое, что и exit $? или пропуская exit .

Вот пример, показывающий, как завершить сценарий, если он запущен пользователем без полномочий root:

#!/bin/bash if [[ "$(whoami)" != root ]]; then echo "Only user root can run this script." exit 1 fi echo "doing stuff. " exit 0 

Если вы запустите сценарий как root, код выхода будет нулевым. В противном случае скрипт выйдет со статусом 1 .

Выводы

Каждая команда оболочки возвращает код выхода при завершении. Команда exit используется для выхода из оболочки с заданным статусом.

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

Источник

How to check the exit status using an ‘if’ statement

What would be the best way to check the exit status in an if statement in order to echo a specific output? I’m thinking of it being:

if [ $? -eq 1 ] then echo "blah blah blah" fi 

The issue I am also having is that the exit statement is before the if statement simply because it has to have that exit code. Also, I know I’m doing something wrong since the exit would obviously exit the program.

Читайте также:  Linux найти сетевую карту

If you need to use the exit code from some particular program invocation in two different places, then you need to preserve it — something along the lines of some_program; rc=$?; if [ $ -eq 1 ] . fi ; exit $

12 Answers 12

Every command that runs has an exit status.

That check is looking at the exit status of the command that finished most recently before that line runs.

If you want your script to exit when that test returns true (the previous command failed) then you put exit 1 (or whatever) inside that if block after the echo .

That being said, if you are running the command and are wanting to test its output, using the following is often more straightforward.

if some_command; then echo command returned true else echo command returned some error fi 

Or to turn that around use ! for negation

if ! some_command; then echo command returned some error else echo command returned true fi 

Note though that neither of those cares what the error code is. If you know you only care about a specific error code then you need to check $? manually.

Источник

Оцените статью
Adblock
detector