Вот что мы получим, когда попытаемся запустить этот скрипт:
$ ./hello.sh
Вызов функции hello() ...
./hello.sh: hello: command not found
Вы вне функции hello()
Как видите, мы получили сообщение об ошибке. Поэтому стоит всегда размещать ваши функции в начале кода или, по крайней мере, непосредственно перед вызовом функции.
Еще один пример использования функции:
#!/bin/bash
# admin.sh – инструмент для администратора
# функция new_user () создает новую учетную запись пользователя
new_user(){
echo 'Подготовка к созданию новых пользователей ...'
sleep 2
# запускаем программу adduser adduser
}
echo '1. Добавить пользователя'
echo '2. Выход'
echo 'Укажите, что вы хотите сделать:'
read choice
case $choice in
1) new_user # вызов функции new_user()
;;
*) exit
;;
esac
Для того чтобы приведенный скрипт работал правильно, вам необходимо запустить его из-под пользователя root, т. к. иначе программа adduser не сможет создать новых пользователей. Надеюсь, этот пример (хоть он и краток) показывает положительный эффект от использования функций.
Перехват сигналов
Вы можете использовать встроенную в bash программу trap для перехвата сигналов в своих программах. Это хороший способ изящно завершать работу программы. Например, если пользователь, когда ваша программа работает, нажмет CTRL-C — программе будет отправлен сигнал interrupt(SIGINT), который завершит ее. Функция trap позволит вам перехватить этот сигнал, что даст возможность либо продолжить выполнение программы, либо сообщить пользователю, что программа завершает работу. Синтаксис этой команды такой:
trap action signal
Здесь:
Список сигналов можно посмотреть с помощью команды trap -l.
При указании сигналов в своих скриптах можно опустить первые три буквы названия сигнала, т. е. SIG. Например, сигнал прерывания это — SIGINT. В вашем скрипте, в качестве его имени, можно указать просто INT. Вы также можете использовать номер сигнала, указанный рядом с его именем. Например, числовое значение сигнала SIGINT — 2. Попробуйте написать и запустить приведенный ниже пример:
#!/bin/bash
# использование команды trap
# перехватываем нажатие CTRL-C и запускаем функцию sorry()
trap sorry INT
# функция sorry() печатает сообщение
sorry(){
echo 'Извини меня, Дэйв. Я не могу этого сделать'
sleep 3
}
# обратный отсчет от 10 до 1:
echo 'Подготовка к уничтожению системы'
for i in 10 9 8 7 6 5 4 3 2 1; do
echo 'Осталось $i секунд до уничтожения...'
sleep 1
done
echo 'Запуск программы уничтожения!'
Наберите и запустите приведенный пример. Когда программа будет работать и вести обратный отсчет, нажмите CTRL-C. Это действие отправит программе сигнал прерывания — SIGINT. Тем не менее сигнал будет перехвачен командой trap, которая, в свою очередь, выполнит функцию sorry(). Вы можете заставить trap игнорировать сигнал, указав символ кавычек вместо указания действия. Также вы можете отключить ловушку с помощью тире: '-'. Например:
# запускать функцию sorry(), если получен сигнал SIGINT
trap sorry INT
# отключение ловушки
trap - INT
# ничего не делать при получении сигнала
SIGINT trap ' INT
Если вы отключаете ловушку, программа работает как обычно — при получении сигнала прерывается ее исполнение и она завершает работу. Когда вы говорите trap ничего не делать при получении сигнала — она делает именно это. Ничего. Программа будет продолжать работать, игнорируя сигнал.
Логические И и ИЛИ
Вы уже видели, что такое управляющие структуры и как их использовать. Для решения тех же задач есть еще два способа. Это логическое И — '&&' и логическое 'ИЛИ' — « || ». Логическое И используется следующим образом:
Сначала выполняется выражение, стоящее слева, если оно истинно, выполняется выражение, стоящее справа. Если
Пример использования:
#!/bin/bash
x=5
y=10
if [ '$x' -eq 5 ] && [ '$y' -eq 10 ]; then