How can I do something like this in bash?
if "`command` returns any error";
then
echo "Returned an error"
else
echo "Proceed..."
fi
asked Oct 16, 2011 at 21:25
0
How to conditionally do something if a command succeeded or failed
That’s exactly what bash’s if
statement does:
if command ; then
echo "Command succeeded"
else
echo "Command failed"
fi
Adding information from comments: you don’t need to use the [
… ]
syntax in this case. [
is itself a command, very nearly equivalent to test
. It’s probably the most common command to use in an if
, which can lead to the assumption that it’s part of the shell’s syntax. But if you want to test whether a command succeeded or not, use the command itself directly with if
, as shown above.
answered Oct 16, 2011 at 21:50
Keith ThompsonKeith Thompson
21.5k6 gold badges48 silver badges55 bronze badges
19
For small things that you want to happen if a shell command works, you can use the &&
construct:
rm -rf somedir && trace_output "Removed the directory"
Similarly for small things that you want to happen when a shell command fails, you can use ||
:
rm -rf somedir || exit_on_error "Failed to remove the directory"
Or both
rm -rf somedir && trace_output "Removed the directory" || exit_on_error "Failed to remove the directory"
It’s probably unwise to do very much with these constructs, but they can on occasion make the flow of control a lot clearer.
answered Oct 17, 2011 at 0:34
3
Check the value of $?
, which contains the result of executing the most recent command/function:
#!/bin/bash
echo "this will work"
RESULT=$?
if [ $RESULT -eq 0 ]; then
echo success
else
echo failed
fi
if [ $RESULT == 0 ]; then
echo success 2
else
echo failed 2
fi
answered Oct 16, 2011 at 21:34
15
This worked for me:
command && echo "OK" || echo "NOK"
if command
succeeds, then echo "OK"
is executed, and since it’s successful, execution stops there. Otherwise, &&
is skipped, and echo "NOK"
is executed.
answered Sep 17, 2013 at 6:36
German RummGerman Rumm
9216 silver badges4 bronze badges
6
It should be noted that if...then...fi
and &&
/||
type of approach deals with exit status returned by command we want to test( 0 on success ); however, some commands don’t return a non-zero exit status if command failed or couldn’t deal with input. This means that the usual if
and &&
/||
approaches won’t work for those particular commands.
For instance, on Linux GNU file
still exits with 0 if it received a non-existing file as argument and find
couldn’t locate the file user specified.
$ 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
In such cases, one potential way we could handle the situation is by reading stderr
/stdin
messages, e.g. those that returned by file
command, or parse output of the command like in find
. For that purposes, case
statement could be used.
$ file ./doesntexist | while IFS= read -r output; do
> case "$output" in
> *"No such file or directory"*) printf "%sn" "This will show up if failed";;
> *) printf "%sn" "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
answered Nov 12, 2017 at 18:57
The most error prone I could come up with was:
- First, get the value. Suppose you do something like:
RR=$?
Now, for not only this situation, but others you may face, consider:
defined variable:
$ AA=1 ; if (( "10#0${AA}" == 1 )) ; then echo yes ; else echo no ; fi
Answer: yes
$ AA=1 ; if (( "10#0${AA}" != 1 )) ; then echo yes ; else echo no ; fi
Answer: no
undefined variable:
$ AA=1 ; if (( "10#0${BB}" == 1 )) ; then echo yes ; else echo no ; fi
Answer: no
$ AA=1 ; if (( "10#0${BB}" != 1 )) ; then echo yes ; else echo no ; fi
Answer: yes
$ AA=1 ; if (( "10#0${BB}" == 0 )) ; then echo yes ; else echo no ; fi
Answer: yes
This prevents all kinds off errors.
You are probably aware of all the syntax, but here some tips:
- Use quotes. Avoid a
"blank"
to benothing
. - The new modern notation for variables is
${variable}
. - Adding a zero concatenated before your number also avoid «no number at all».
- But wait, adding a zero makes the number become
base-8
. You will get an error like:value too great for base (error token is "08")
for numbers above7
. That is when10#
comes into play:10#
forces the number to bebase-10
.
answered Nov 19, 2017 at 1:15
DrBecoDrBeco
7247 silver badges20 bronze badges
You can do this:
if ($( ping 4.4.4.4 -c1 > /dev/null )) ; then
echo "ping response succsess!!!"
fi
answered Apr 1, 2015 at 15:19
1
#!/bin/bash
if command-1 ; then
echo "command-1 succeeded and now running from this block command-2"
command-2
else
echo "command-1 failed and now running from this block command-3"
command-3
fi
answered Nov 22, 2017 at 16:04
1
As noted elsewhere in this thread, the original question basically answers itself. Here is an illustration showing that if
conditions may also be nested.
This example uses if
to check if a file exists and if it is a regular file. If those conditions are true, then check whether or not it has a size greater than 0.
#!/bin/bash
echo "Which error log are you checking today? "
read answer
if [ -f /opt/logs/$answer*.errors ]
then
if [ -s /opt/logs/$answer*.errors ]
then
echo "Content is present in the $answer error log file."
else
echo "No errors are present in the $answer error log file."
fi
else
echo "$answer does not have an error log at this time."
fi
answered Dec 24, 2015 at 2:23
2
This could be done simply in this way as $?
gives you the status of last command executed.
So it could be
#!/bin/sh
... some command ...
if [ $? == 0 ] ; then
echo '<the output message you want to display>'
else
echo '<failure message>'
fi
Ouki
5,8224 gold badges23 silver badges31 bronze badges
answered Oct 18, 2015 at 18:57
2
You must log in to answer this question.
Инструменты автоматизации и мониторинга удобны тем, что разработчик может взять готовые скрипты, при необходимости адаптировать и использовать в своём проекте. Можно заметить, что в некоторых скриптах используются коды завершения (exit codes), а в других нет. О коде завершения легко забыть, но это очень полезный инструмент. Особенно важно использовать его в скриптах командной строки.
Что такое коды завершения
В Linux и других Unix-подобных операционных системах программы во время завершения могут передавать значение родительскому процессу. Это значение называется кодом завершения или состоянием завершения. В POSIX по соглашению действует стандарт: программа передаёт 0
при успешном исполнении и 1
или большее число при неудачном исполнении.
Почему это важно? Если смотреть на коды завершения в контексте скриптов для командной строки, ответ очевиден. Любой полезный Bash-скрипт неизбежно будет использоваться в других скриптах или его обернут в однострочник Bash. Это особенно актуально при использовании инструментов автоматизации типа SaltStack или инструментов мониторинга типа Nagios. Эти программы исполняют скрипт и проверяют статус завершения, чтобы определить, было ли исполнение успешным.
Кроме того, даже если вы не определяете коды завершения, они всё равно есть в ваших скриптах. Но без корректного определения кодов выхода можно столкнуться с проблемами: ложными сообщениями об успешном исполнении, которые могут повлиять на работу скрипта.
Что происходит, когда коды завершения не определены
В Linux любой код, запущенный в командной строке, имеет код завершения. Если код завершения не определён, Bash-скрипты используют код выхода последней запущенной команды. Чтобы лучше понять суть, обратите внимание на пример.
#!/bin/bash
touch /root/test
echo created file
Этот скрипт запускает команды touch
и echo
. Если запустить этот скрипт без прав суперпользователя, команда touch
не выполнится. В этот момент мы хотели бы получить информацию об ошибке с помощью соответствующего кода завершения. Чтобы проверить код выхода, достаточно ввести в командную строку специальную переменную $?
. Она печатает код возврата последней запущенной команды.
$ ./tmp.sh
touch: cannot touch '/root/test': Permission denied
created file
$ echo $?
0
Как видно, после запуска команды ./tmp.sh
получаем код завершения 0
. Этот код говорит об успешном выполнении команды, хотя на самом деле команда не выполнилась. Скрипт из примера выше исполняет две команды: touch
и echo
. Поскольку код завершения не определён, получаем код выхода последней запущенной команды. Это команда echo
, которая успешно выполнилась.
Скрипт:
#!/bin/bash
touch /root/test
Если убрать из скрипта команду echo
, можно получить код завершения команды touch
.
$ ./tmp.sh
touch: cannot touch '/root/test': Permission denied
$ echo $?
1
Поскольку touch
в данном случае — последняя запущенная команда, и она не выполнилась, получаем код возврата 1
.
Как использовать коды завершения в Bash-скриптах
Удаление из скрипта команды echo
позволило нам получить код завершения. Что делать, если нужно сделать разные действия в случае успешного и неуспешного выполнения команды touch
? Речь идёт о печати stdout
в случае успеха и stderr
в случае неуспеха.
Проверяем коды завершения
Выше мы пользовались специальной переменной $?
, чтобы получить код завершения скрипта. Также с помощью этой переменной можно проверить, выполнилась ли команда touch
успешно.
#!/bin/bash
touch /root/test 2> /dev/null
if [ $? -eq 0 ]
then
echo "Successfully created file"
else
echo "Could not create file" >&2
fi
После рефакторинга скрипта получаем такое поведение:
- Если команда
touch
выполняется с кодом0
, скрипт с помощьюecho
сообщает об успешно созданном файле. - Если команда
touch
выполняется с другим кодом, скрипт сообщает, что не смог создать файл.
Любой код завершения кроме 0
значит неудачную попытку создать файл. Скрипт с помощью echo
отправляет сообщение о неудаче в stderr
.
Выполнение:
$ ./tmp.sh
Could not create file
Создаём собственный код завершения
Наш скрипт уже сообщает об ошибке, если команда touch
выполняется с ошибкой. Но в случае успешного выполнения команды мы всё также получаем код 0
.
$ ./tmp.sh
Could not create file
$ echo $?
0
Поскольку скрипт завершился с ошибкой, было бы не очень хорошей идеей передавать код успешного завершения в другую программу, которая использует этот скрипт. Чтобы добавить собственный код завершения, можно воспользоваться командой exit
.
#!/bin/bash
touch /root/test 2> /dev/null
if [ $? -eq 0 ]
then
echo "Successfully created file"
exit 0
else
echo "Could not create file" >&2
exit 1
fi
Теперь в случае успешного выполнения команды touch
скрипт с помощью echo
сообщает об успехе и завершается с кодом 0
. В противном случае скрипт печатает сообщение об ошибке при попытке создать файл и завершается с кодом 1
.
Выполнение:
$ ./tmp.sh
Could not create file
$ echo $?
1
Как использовать коды завершения в командной строке
Скрипт уже умеет сообщать пользователям и программам об успешном или неуспешном выполнении. Теперь его можно использовать с другими инструментами администрирования или однострочниками командной строки.
Bash-однострочник:
$ ./tmp.sh && echo "bam" || (sudo ./tmp.sh && echo "bam" || echo "fail")
Could not create file
Successfully created file
bam
В примере выше &&
используется для обозначения «и», а ||
для обозначения «или». В данном случае команда выполняет скрипт ./tmp.sh
, а затем выполняет echo "bam"
, если код завершения 0
. Если код завершения 1
, выполняется следующая команда в круглых скобках. Как видно, в скобках для группировки команд снова используются &&
и ||
.
Скрипт использует коды завершения, чтобы понять, была ли команда успешно выполнена. Если коды завершения используются некорректно, пользователь скрипта может получить неожиданные результаты при неудачном выполнении команды.
Дополнительные коды завершения
Команда exit
принимает числа от 0
до 255
. В большинстве случаев можно обойтись кодами 0
и 1
. Однако есть зарезервированные коды, которые обозначают конкретные ошибки. Список зарезервированных кодов можно посмотреть в документации.
Адаптированный перевод статьи Understanding Exit Codes and how to use them in bash scripts by Benjamin Cane. Мнение администрации Хекслета может не совпадать с мнением автора оригинальной публикации.
I’m building a Shell Script that has a if
function like this one:
if jarsigner -verbose -keystore $keyst -keystore $pass $jar_file $kalias
then
echo $jar_file signed sucessfully
else
echo ERROR: Failed to sign $jar_file. Please recheck the variables
fi
...
I want the execution of the script to finish after displaying the error message. How I can do this?
Bondolin
2,7437 gold badges32 silver badges61 bronze badges
asked Dec 7, 2010 at 21:10
Nathan CamposNathan Campos
28.6k59 gold badges193 silver badges299 bronze badges
If you put set -e
in a script, the script will terminate as soon as any command inside it fails (i.e. as soon as any command returns a nonzero status). This doesn’t let you write your own message, but often the failing command’s own messages are enough.
The advantage of this approach is that it’s automatic: you don’t run the risk of forgetting to deal with an error case.
Commands whose status is tested by a conditional (such as if
, &&
or ||
) do not terminate the script (otherwise the conditional would be pointless). An idiom for the occasional command whose failure doesn’t matter is command-that-may-fail || true
. You can also turn set -e
off for a part of the script with set +e
.
answered Dec 7, 2010 at 22:12
3
Are you looking for exit
?
This is the best bash guide around.
http://tldp.org/LDP/abs/html/
In context:
if jarsigner -verbose -keystore $keyst -keystore $pass $jar_file $kalias
then
echo $jar_file signed sucessfully
else
echo ERROR: Failed to sign $jar_file. Please recheck the variables 1>&2
exit 1 # terminate and indicate error
fi
...
MattBianco
1,4912 gold badges20 silver badges30 bronze badges
answered Dec 7, 2010 at 21:13
Byron WhitlockByron Whitlock
52.4k28 gold badges123 silver badges168 bronze badges
2
If you want to be able to handle an error instead of blindly exiting, instead of using set -e
, use a trap
on the ERR
pseudo signal.
#!/bin/bash
f () {
errorCode=$? # save the exit code as the first thing done in the trap function
echo "error $errorCode"
echo "the command executing at the time of the error was"
echo "$BASH_COMMAND"
echo "on line ${BASH_LINENO[0]}"
# do some error handling, cleanup, logging, notification
# $BASH_COMMAND contains the command that was being executed at the time of the trap
# ${BASH_LINENO[0]} contains the line number in the script of that command
# exit the script or return to try again, etc.
exit $errorCode # or use some other value or do return instead
}
trap f ERR
# do some stuff
false # returns 1 so it triggers the trap
# maybe do some other stuff
Other traps can be set to handle other signals, including the usual Unix signals plus the other Bash pseudo signals RETURN
and DEBUG
.
dutoitns
1,9151 gold badge25 silver badges32 bronze badges
answered Dec 8, 2010 at 5:12
Dennis WilliamsonDennis Williamson
343k90 gold badges373 silver badges438 bronze badges
Here is the way to do it:
#!/bin/sh
abort()
{
echo >&2 '
***************
*** ABORTED ***
***************
'
echo "An error occurred. Exiting..." >&2
exit 1
}
trap 'abort' 0
set -e
# Add your script below....
# If an error occurs, the abort() function will be called.
#----------------------------------------------------------
# ===> Your script goes here
# Done!
trap : 0
echo >&2 '
************
*** DONE ***
************
'
answered Mar 5, 2014 at 15:43
5
When writing Bash scripts, it’s essential to include error handling to ensure that the script exits gracefully in the event of an error. In this article, we’ll cover all the possible techniques for exiting when errors occur in Bash scripts, including the use of exit codes, the “set -e” option, the “trap” command, and command substitution. In this article, we will discuss the various techniques and methods to handle errors and exit gracefully in Bash scripts. Error handling is an essential aspect of writing scripts, as it helps to ensure that the script exits in an appropriate manner, even when an error occurs. Without proper error handling, a script might continue to execute even when an error has occurred, leading to unexpected results or even system crashes.
We will start by discussing the use of exit codes, which are used to indicate the status of the script’s execution. We will then move on to the “set -e” option, which causes the script to exit immediately if any command exits with a non-zero exit code. Next, we will cover the “trap” command, which allows you to specify a command or set of commands to be executed when the script exits, whether it’s due to an error or not. Then, we will look at command substitution, which allows you to capture the output of a command and assign it to a variable. Finally, we will discuss the technique of suppressing error messages.
Exiting when errors occur in Bash scripts is an important aspect of script development, as it helps to ensure that the script stops running and exits cleanly in the event of an error. There are several ways to exit a Bash script when an error occurs, including using the exit command, using the return command, and using the trap command. It is also important to include error handling and error messages in your script to provide useful information to the user in the event of an error.
Exit Codes
Exit codes are used to indicate the status of the script’s execution, with a zero exit code indicating success and non-zero codes indicating an error. One of the simplest ways to exit a Bash script when an error occurs is to use the “exit” command with a non-zero exit code. For example, the following script exits with a code of 1 if the “mkdir” command fails:
Script:
#!/bin/bash mkdir /tmp/example if [ $? -ne 0 ]; then exit 1 fi
Output:
Another way to check the exit code of a command is by using the $? variable. For example, the following script also exits with a code of 1 if the “mkdir” command fails:
Script:
#!/bin/bash
mkdir /home/lucifer/yash/first
if [ $? -ne 0 ]; then
echo “Error: Failed to create directory”
exit 1
fi
Output:
Set -e Option
Another way to exit a Bash script when an error occurs is to use the “set -e” option. This option causes the script to exit immediately if any command exits with a non-zero exit code. For example, the following script exits immediately if the “mkdir” command fails:
Script:
#!/bin/bash set -e mkdir /tmp/example
Output:
Trap Command
The trap command allows you to specify a command or set of commands to be executed when the script exits, whether it’s due to an error or not. For example, the following script uses the trap command to delete the directory if the script exits with a non-zero exit code:
Script:
#!/bin/bash trap 'rm -rf /tmp/example' EXIT mkdir /tmp/example # some commands here exit 0
Output:
Command Substitution
Another way to handle errors in Bash scripts is by using command substitution. This technique allows you to capture the output of a command and assign it to a variable. For example, the following script captures the output of the “mkdir” command and assigns it to the “result” variable. If the command fails, the script exits with a code of 1:
Script:
#!/bin/bash result=$(mkdir /tmp/example) if [ $? -ne 0 ]; then echo "Error: $result" exit 1 fi
Output:
In this example, if the mkdir command fails to create the directory, the error message will be assigned to the “result” variable and displayed on the console.
Suppressing Error Messages
It is also possible to suppress the error message generated by a command by adding 2> /dev/null to the command.
Script:
#!/bin/bash mkdir /tmp/example 2> /dev/null if [ $? -ne 0 ]; then exit 1 fi
Output:
In this example, if the mkdir command fails to create the directory, the error message will not be displayed on the console.
Exit When Any Command Fails
One way to exit a Bash script when any command fails is to use the set -e option. This option causes the script to exit immediately if any command returns a non-zero exit status.
For example, the following script will exit if the ls command fails to list the contents of the specified directory:
Script:
#!/bin/bash set -e ls /nonexistent_directory echo "This line will not be executed"
If the directory /nonexistent_directory does not exist, the script will exit with an error message like this:
Output:
And it will not execute the second line.
Another way to exit if any command fails is to use the || operator after each command, for example:
Script:
#!/bin/bash
ls /nonexistent_directory || exit 1
echo “This line will not be executed”This script will also exit with an error message
Output:
And it will not execute the second line.
You can also check the exit status of the last command with $? variable and use the if condition with the exit command to exit if any command fails.
Script:
#!/bin/bash ls /nonexistent_directory if [ $? -ne 0 ] then echo "Command failed" exit 1 else echo "Command Successful" fi
This script will also exit with an error message:
Output:
And it will not execute the second line.
It is important to note that, when using the set -e option or || operator, the script will exit even if the failure is in a command inside a function or a subshell. To prevent this behavior, you can use set +e before the function or subshell and set -e after it.
Exit Only When Specific Commands Fail
To exit a Bash script only when specific commands fail, you can use the || operator in conjunction with the exit command. The || operator is used to execute a command only if the preceding command fails (returns a non-zero exit status).
For example, the following script will exit if the ls command fails to list the contents of the specified directory, but will continue to execute subsequent commands even if they fail:
Script:
#!/bin/bash ls /nonexistent_directory || exit 1 echo "This line will be executed" rm /nonexistent_file || true echo "This line will also be executed"
If the directory /nonexistent_directory does not exist, the script will exit with an error message like this:
Output:
And it will not execute the second and third lines.
It is important to note that, the true command is used to prevent the rm command from causing the script to exit if it fails. Without the true command, the script would exit if the file /nonexistent_file does not exist.
Another way to achieve this is by using an if statement and checking the exit status of the command with $? variable, like:
Script:
#!/bin/bash ls /nonexistent_directory if [ $? -ne 0 ] then echo "Command failed" exit 1 else echo "Command Successful" fi echo "This line will be executed" rm /nonexistent_file if [ $? -ne 0 ] then echo "Command failed" else echo "Command Successful" fi
This script will also exit with an error message:
Output:
And it will not execute the second and third lines.
It is important to note that, the exit status of the last executed command is stored in the $? variable. And you can use it to check if the command is successful or not.
Conclusion
There are multiple ways to handle errors and exit gracefully in Bash scripts. By using exit codes, the “set -e” option, the “trap” command, command substitution, and suppressing error messages, you can ensure that your script exits in an appropriate manner and provides appropriate error handling for your script. It’s essential to test your script with different inputs and error conditions to ensure that it is handling errors as expected. It’s also important to include clear and descriptive error messages that indicate the cause of the error and provide guidance on how to resolve it. With these techniques, you can write robust and reliable Bash scripts that can handle errors and exit gracefully.
Обработка ошибок — очень важная часть любого языка программирования. У Bash нет лучшего варианта, чем другие языки программирования, для обработки ошибки скрипта. Но важно, чтобы скрипт Bash был безошибочным во время выполнения скрипта из терминала. Функция обработки ошибок может быть реализована для сценария Bash несколькими способами. В этой статье показаны различные методы обработки ошибок в сценарии Bash.
Пример 1. Обработка ошибок с использованием условного оператора
Создайте файл Bash со следующим сценарием, который показывает использование условного оператора для обработки ошибок. Первый оператор «if» используется для проверки общего количества аргументов командной строки и вывода сообщения об ошибке, если значение меньше 2. Затем значения делимого и делителя берутся из аргументов командной строки. Если значение делителя равно 0, генерируется ошибка, и сообщение об ошибке печатается в файле error.txt. Вторая команда «if» используется для проверки того, является ли файл error.txt пустым или нет. Сообщение об ошибке печатается, если файл error.txt не пуст.
#!/bin/bash #Проверить значения аргументов if [ $# -lt 2 ]; then echo "Отсутствует один или несколько аргументов." exit fi #Чтение значения делимого из первого аргумента командной строки dividend=$1 #Читание значения делителя из второго аргумента командной строки divisor=$2 #Деление делимого на делитель result=`echo "scale=2; $dividend/$divisor"|bc 2>error.txt` #Читать содержимое файла ошибки content=`cat error.txt` if [ -n "$content" ]; then #Распечатать сообщение об ошибке, если файл error.txt непустой echo "Произошла ошибка, кратная нулю." else #Распечатать результат echo "$dividend/$divisor = $result"
Вывод:
Следующий вывод появляется после выполнения предыдущего скрипта без каких-либо аргументов:
andreyex@andreyex:-/Desktop/bash$ bash error1.bash One or more argument is missing. andreyex@andreyex:~/Desktop/bash$
Следующий вывод появляется после выполнения предыдущего скрипта с одним значением аргумента:
andreyex@andreyex:-/Desktop/bash$ bash error1.bash 75 One or more argument is missing. andreyex@andreyex:~/Desktop/bash$
Следующий вывод появляется после выполнения предыдущего скрипта с двумя допустимыми значениями аргумента:
andreyex@andreyex:-/Desktop/bash$ bash error1.bash 75 8 75/8 = 9.37 andreyex@andreyex:-/Desktop/bash$
Следующий вывод появляется после выполнения предыдущего скрипта с двумя значениями аргументов, где второй аргумент равен 0. Выводится сообщение об ошибке:
andreyex@andreyex:~/Desktop/bash$ bash error1.bash 75 0 Divisible by zero error occurred. andreyex@andreyex:~/Desktop/bash$
Пример 2: Обработка ошибок с использованием кода состояния выхода
Создайте файл Bash со следующим сценарием, который показывает использование обработки ошибок Bash по коду состояния выхода. Любая команда Bash принимается в качестве входного значения, и эта команда выполняется позже. Если код состояния выхода не равен нулю, печатается сообщение об ошибке. В противном случае печатается сообщение об успешном выполнении.
#!/bin/bash #Взять имя команды Linux echo -n "Введите команду: " read cmd_name #Выполнить команду $cmd_name #Проверить, действительна ли команда, if [ $? -ne 0 ]; then echo "$cmd_name - недопустимая команда." else echo "$cmd_name является корректной командой." fi fi
Вывод:
Следующий вывод появляется после выполнения предыдущего скрипта с допустимой командой. Здесь «data» принимается как команда во входном значении, которая является допустимой:
andreyex@andreyex:-/Desktop/bash$ bash error2.bash Enter a command: date Tue Dec 27 19:18:39 +06 2022 date is a valid command. andreyex@andreyex:-/Desktop/bash$
Следующий вывод появляется после выполнения предыдущего скрипта для недопустимой команды. Здесь «cmd» воспринимается как недопустимая команда во входном значении:
andreyex@andreyex:-/Desktop/bash$ bash error2.bash Enter a command: cmd error2.bash: line 7: cmd: command not found cmd is a invalid command. andreyex@andreyex: -/Desktop/bash$
Пример 3: остановить выполнение при первой ошибке
Создайте файл Bash со следующим сценарием, который показывает метод остановки выполнения при появлении первой ошибки сценария. В следующем скрипте используются две недопустимые команды. Таким образом, выдаются две ошибки. Сценарий останавливает выполнение после выполнения первой недопустимой команды с помощью команды «set -e».
#!/bin/bash #Установите параметр для завершения скрипта при первой ошибке set -e echo 'Текущие дата и время: ' #Действительная команда date echo 'Текущий рабочий каталог: ' #Неверная команда cwd echo 'имя пользователя: ' #Действительная команда whoami echo 'Список файлов и папок: ' #Неверный список list
Вывод:
Следующий вывод появляется после выполнения предыдущего скрипта. Сценарий останавливает выполнение после выполнения недопустимой команды «cwd»:
andreyex@andreyex:-/Desktop/bash$ bash error3.bash Current date and time: Tue Dec 27 19:19:38 +06 2022 Current orking Directory: error3.bash: line 9: cwd: command not found andreyex@andreyex:-/Desktop/bash$
Пример 4: остановить выполнение для неинициализированной переменной
Создайте файл Bash со следующим сценарием, который показывает метод остановки выполнения сценария для неинициализированной переменной. Значения имени пользователя и пароля берутся из значений аргументов командной строки. Если какое-либо из значений этих переменных не инициализировано, выводится сообщение об ошибке. Если обе переменные инициализированы, сценарий проверяет, являются ли имя пользователя и пароль действительными или недействительными.
#!/bin/bash #Установите параметр завершения сценария для неинициализированной переменной set -u #Установите значение первого аргумента командной строки на имя пользователя username=$1 #Проверьте правильность или недопустимость имени пользователя и пароля password=$2 #Проверьте правильность или недопустимость имени пользователя и пароля if [[ $username == 'admin' && $password == 'hidenseek' ]]; then echo "Действительный пользователь." else echo "Неверный пользователь." fi
Вывод:
Следующий вывод появляется, если сценарий выполняется без использования какого-либо значения аргумента командной строки. Скрипт останавливает выполнение после получения первой неинициализированной переменной:
andreyex@andreyex:~/Desktop/bash$ bash error4.bash error4.bash: line 7: $1: unbound variable andreyex@andreyex:~/Desktop/bash$
Следующий вывод появляется, если сценарий выполняется с одним значением аргумента командной строки. Скрипт останавливает выполнение после получения второй неинициализированной переменной:
andreyex@andreyex:-/Desktop/bash$ bash error4.bash admin error4.bash: line 9: $2: unbound variable andreyex@andreyex:-/Desktop/bash$
Следующий вывод появляется, если сценарий выполняется с двумя значениями аргумента командной строки — «admin» и «hide». Здесь имя пользователя действительно, но пароль недействителен. Итак, выводится сообщение «Invalid user»:
andreyex@andreyex:-/Desktop/bash$ bash error4.bash admin hide Invalid user. andreyex@andreyex:-/Desktop/bash$
Следующий вывод появляется, если сценарий выполняется с двумя значениями аргументов командной строки — «admin» и «hidenseek». Здесь имя пользователя и пароль действительны. Итак, выводится сообщение «Valid user»:
andreyex@andreyex:-/Desktop/bash$ bash error4.bash admin hidenseek Valid user. andreyex@andreyex:~/Desktop/bash$
Заключение
Различные способы обработки ошибок в скрипте Bash показаны в этой статье на нескольких примерах. Мы надеемся, что это поможет пользователям Bash реализовать функцию обработки ошибок в своих сценариях Bash.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.