Если пользователь выполняет некорректный ввод, раздается звуковой сигнал и отображается предостерегающее сообщение. Хотя в начале этой главы упоминалось о том, что будут применяться операторы echo Linux BSD, для генерации звукового сигнала будет применена команда из версии System V:
echo '"\007 the bell rang"
Конструкции echo и read применяются для задержки отображения экрана до тех пор, пока пользователь не нажмет клавишу [Enter]. При этом могут просматриваться любые сообщения или вывод команд.
В конце концов, потребуется очистить экран. Эта задача выполняется с помощью команды tput (о применении этой команды мы поговорим позже) в том случае, когда не используется clear. А теперь посмотрите на сам сценарий.
$ pg menu
#!/bin/sh # меню
# установка даты, имени пользователя и хоста
MYDATE=`date +%d/%m/%Y`
THIS_HOST= `hostname -s` USER=`whoami`
# бесконечный цикл!
while :
do
# очистка экрана с помощью команды tput
# здесь начинается конструкция "документ здесь"
cat <
# завершение конструкции "документ здесь"
echo -e -n "\tYour Choice [1,2,3,H, Q] >"
read CHOICE
case $CHOICE in
1) ls
;;
2) vi
;;
3) who
;;
H|h)
# использование конструкции "документ здесь" для экрана помощи
cat <
This "ls the help screen, nothing here yet to help you!
MAYDAY
;;
Q|q) exit 0
*) echo -e "\t\Q07unknown user response"
;;
esac
echo -e -n "\tHit the return key to continue"
read DUMMY
done
18.10. Заключение
Ядро любого более или менее сложного сценария образуют различные управляющие конструкции. Если вы ожидаете от сценария определенного "интеллекта", он должен быть способным принимать решения.
В этой главе было изучено, каким образом управляющие конструкции обеспечивают компромисс между хорошими и надежными сценариями. Здесь также изучается обработка списков и рассматривается работа с циклами, условиями для которых являются значения "истина" или "ложь".
Функции интерпретатора shell
До сих пор весь программный код сценариев данной книги выполнялся последовательно от начала до конца программы. Подобный подход неплох, но при этом некоторые фрагменты кода, рассмотренного в наших примерах, дублируются в пределах одного сценария.
Интерпретатор команд shell позволяет группировать наборы Команд или конструкций, создавая повторно используемые блоки. Подобные блоки называются shell–функциями.
В данной главе будут рассмотрены следующие темы:
• определение функций;
• работа с функциями в сценарии;
• использование функций, определенных в файле функций;
• примеры функций.
Функция состоит из двух частей:
Метка функции
Тело функции
В качестве метки выступает имя функции; тело функции образует набор команд. составляющих саму функцию. Имя функции должно быть уникальным: если это не так, результаты будут плачевны. Это связано с тем, что в случае наличия двух различных функций с одинаковыми именами сценарий просто не сможет вызвать нужную функцию.
Формат, применяемый для определения функций:
имя_функции ( )
{
Команда1}
или
имя_функции () {
команда 1 \
}
Приемлемы оба способа определения функции. Можно также использовать ключевое слово function перед именем функции имя функции.
function имя_функции ()
{
….
}
Функцию можно представлять себе как некоторый вид сценария, находящегося внутри другого сценария, но в этом случае следует учитывать одну особенность. При вызове функции она остается в текущем интерпретаторе shell, а ее копия хранится в памяти. С другой стороны, если вызывается или выполняется сценарий из другого сценария, создается отдельный интерпретатор shell. В таком случае становятся недействительными все существующие переменные, определенные в предыдущем сценарии.
Функции могут быть размещены в том же самом файле, что и сценарии, либо в отдельном файле, содержащем функции. При этом функции не всегда включают множество конструкций или команд; может просто содержаться единственная конструкция echo, которая выполняется при вызове функции.
19.1. Объявление функций в сценарии
Вот пример простой функции:
hello ()
{
echo "Hello there today's date is `date`"
}