Чтение онлайн

ЖАНРЫ

Краткое введение в программирование на Bash

Родригес Гарольд

Шрифт:

echo -n "Введите имя: "

read user_name

# проверка ввода пользователя

if [ -z "$user_name" ]; then

echo "Вы не сказали мне свое имя!"

exit

fi

echo "Привет $user_name!"

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

требуют от пользователя ввести какие-то данные.

Функции

Использование функций делает сопровождение своих скриптов проще. Проще говоря, это хороший способ разделить программу на более мелкие куски. Функция выполняет определенное действие и может возвращать то значение, какое вы пожелаете. Прежде чем продолжать, я приведу пример скрипта, написанного с использованием функции:

#!/bin/bash

# функция hello печатает сообщение

hello{

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

}

echo "Вызываем функцию hello…"

hello

Попробуйте запустить код из примера выше. Функция hello в нем имеет только одно предназначение — просто напечатать сообщение. Но, конечно же, они могут решать и более сложные задачи. Выше мы вызвали функцию hello, используя строку:

hello

Когда запускается эта строка, bash ищет скрипт для строки hello. Он находит его в начале файла и выполняет его содержимое. Функции всегда вызываются по своему имени, что мы и видели выше. При написании функции вы можете обьявить ее, просто указав имя_функции , как это сделано выше, или если вы хотите сделать ее объявление более явным, можете объявить ее так: function имя_функции. Ниже представлен альтернативный способ написания функции hello

function hello {

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

}

После имени функции должны следовать пустые открывающая и закрывающая скобки: "", за ними следует пара фигурных скобок: «{…}», содержащих тело функции. Другими словами, весь код функции заключен в эти фигурные скобки. Функции всегда должны быть предварительно объявлены до своего вызова. Давайте попробуем в приведенном выше примере вызвать функцию до ее объявления:

#!/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 игнорировать сигнал, указав символ кавычек вместо указания действия. Также вы можете отключить ловушку с помощью тире: "-". Например:

Поделиться с друзьями: