Краткое введение в программирование на Bash - [7]

Шрифт
Интервал

должны быть предварительно объявлены до своего вызова. Давайте попробуем в приведенном выше примере вызвать функцию до ее объявления:

>#!/bin/bash

>echo "Вызов функции hello() …"

>hello

>echo "Вы вне функции hello()"

># функция hello() просто выводит сообщение

>hello(){

>echo "Вы находитесь в функции hello()"

>}

Вот что мы получим, когда попытаемся запустить этот скрипт:

>$ ./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

Здесь: 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 ничего не делать при получении сигнала — она делает именно это. Ничего. Программа будет продолжать работать, игнорируя сигнал.

Логические И и ИЛИ

Вы уже видели, что такое управляющие структуры и как их использовать. Для решения тех же задач есть еще два способа. Это логическое И — "&&" и логическое "ИЛИ" — « || ». Логическое И используется следующим образом:

выражение_1&&выражение_2

Сначала выполняется выражение, стоящее слева, если оно истинно, выполняется выражение, стоящее справа. Если выражение_1 возвращает ЛОЖЬ, то выражение_2 не будет выполнено. Если оба выражения возвращают ИСТИНУ, выполняется следующий набор команд. Если какое-либо из выражений не истинно, приведенное выражение считает ложным в целом. Другими словами, все работает так:

если выражение_1 истинно И выражение_2 истинно, тогда выполнять…[15]

Пример использования:

>#!/bin/bash

>x=5

>y=10

>if [ "$x" -eq 5 ] && [ "$y" -eq 10 ]; then

>echo "Оба условия верны"

>else

>echo "Условия не верны"

>fi

Здесь мы находим, что переменные х и у содержат именно те значения, которые мы проверяем, поэтому проверяемые условия верны. Если вы измените значение с х = 5 на х = 12, а затем снова запустите программу, она выдаст фразу «Условия не верны».

Логическое ИЛИ используется аналогичным образом. Разница лишь в том, что оно проверяет ошибочность выражения слева. Если это так — оно начинает выполнять следующий оператор:

>выражение_1||выражение_2

Данное выражение в псевдокоде выглядит так:

>если выражение_1 истинно ИЛИ выражение_2 истинно, выполняем …


Рекомендуем почитать
Попаданец для драконши

Я тут попал в другой мир... и знаете, что меня больше всего расстраивает? Тут нет гугла. А как бы было удобно... Эй, гугл, как расколдовать злую королеву если ты - инвалид-колясочник? Эй, гугл, как правильно проводить феминистскую революцию? Эй, гугл, как пользоваться летающим кораблем? Эй, гугл, рыцари какого клана самые лучшие? Но увы... гугла нет. Так что приходится справляться самостоятельно.


Феномен зверя

После ночи, проведённой с незнакомцем, жизнь Эмили круто меняется. Болезненная привязанность и странности окружают девушку со всех сторон и не дают спокойно жить. Тайны затягивают всё глубже, и уже нет возможности вырваться из западни. Кому верить: незнакомцу, после ночи с которым осталось непонятное, практически невозможное побороть притяжение или мужчине, что готов помочь разобраться во всех тайнах и странностях, творящихся в жизни Эмили? Неправильный выбор может стать роковым. Привычный мир рухнет в одночасье, когда раскроются тайны и станут известны истинные мотивы.


Соната лунной принцессы

Соединенные Штаты, Китай, Великобритания, Россия, Европейский Союз. Больше этих некогда влиятельных сверхдержав не найти ни на одной карте мира. Много лет назад само существование жизни на планете было поставлено под угрозу. Города исчезали один за другим, становились историей, а цивилизованный мир таял. Так продолжалось, пока ученые не создали оружие, способное остановить нашествие врагов из параллельной вселенной, прозванных пожирателями. С тех пор на планете уцелели только три города.


Каникулы

Каждая девочка мечтает побыть принцессой, а принцесса мечтает побыть простой девочкой да еще и накануне свадьбы. Тем более, что принцесса наша личность разносторонне развитая, очень любознательная и жизнерадостная. А ее замуж!


Психокинетики-2

Продолжение супергеройского романа «Психокинетики». Враг повержен, но враг — ложный. Теперь героям предстоит разобраться в хитросплетениях глобального заговора, частью которого они стали, и в себе самих. Очередные опасности. Новые способности. И одна угроза на всех.


Они среди нас

Потомки библейских исполинов расселились по земле и живут среди нас. Постепенно, создавая семьи с обычными людьми, они измельчали до человеческих размеров. Борьба полов в семействах исполинов за право властвовать на планете не прекращалась и в двадцать первом веке. В их отношения вмешались силы небесные, пригрозив запустить программу перерождения человека в бесполое существо, способное рождаться на свет с эмбрионом своего единственного будущего ребёнка внутри. Когда и эта угроза не вразумила их, то силы небесные, под предлогом надвигающейся глобальной катастрофы на Земле, решили переселить их на антиземлю — планету Антихтон, движущуюся по одной орбите с Землёй, по другую сторону Солнца.