Обработка ошибок Bash

Обработка ошибок — очень важная часть любого языка программирования. У 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.