Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Электронные книги по ОС Linux
Руководство по Bash для начинающих
Назад Глава 9: Повторяющиеся задачи Вперед

Создаем меню с помощью встроенной команды select

Общие положения

Использование команды select

Конструкция select позволяет упростить создание меню. Синтаксис очень похож на синтаксис цикла for:

select WORD [in LIST]; do RESPECTIVE-COMMANDS; done 

Для LIST выполняется подстановка и генерируется список элементов. Результат выдается в стандартный поток ошибок, каждому элементу предшествует номер. Если [in LIST] отсутствует, то выдаются позиционные параметры, как если бы было указано in $@. LIST выводится только один раз.

После того, как будут выведены все элементы, выдается строка приглашения PS3 и из стандартного ввода считывается одна строка. Если в этой строке есть число, соответствующее одному из пунктов меню, значению переменной WORD присваивается имя этого элемента. Если строка пустая, элементы меню и приглашение PS3 отображаются снова. Если будет прочитан символ EOF (End Of File — конец файла), происходит выход из цикла. Поскольку большинство пользователей не имеют понятия, какие комбинации клавиш используются в последовательности EOF, для пользователей в качестве одного из элементов будет более удобным использовать команду break. Для любого другого значения, считанного из строки, переменной WORD будет присвоена пустая строка.

Прочитанная строка сохраняется в переменной REPLY.

После выбора каждого из вариантов RESPECTIVE-COMMANDS будет выполняться до тех пор, пока не будет выбран номер, соответствующий команде break. После этого произойдет выход из цикла.

Примеры

Это очень простой пример, но, как вы видите, он не очень удобен для пользователей:

[carol@octarine testdir] cat private.sh
#!/bin/bash

echo "This script can make any of the files in this directory private."
echo "Enter the number of the file you want to protect:"

select FILENAME in *;
do
     echo "You picked $FILENAME ($REPLY), it is now only accessible to you."
     chmod go-rwx "$FILENAME"
done

[carol@octarine testdir] ./private.sh
This script can make any of the files in this directory private.
Enter the number of the file you want to protect:
1) archive-20030129
2) bash
3) private.sh
#? 1
You picked archive-20030129 (1)
#?

Задание значения строке подсказки PS3 и добавление варианта, предназначенного для выхода, делает его лучше:

#!/bin/bash

echo "This script can make any of the files in this directory private."
echo "Enter the number of the file you want to protect:"

PS3="Your choice: "
QUIT="QUIT THIS PROGRAM - I feel safe now."
touch "$QUIT"

select FILENAME in *;
do
  case $FILENAME in
        "$QUIT")
          echo "Exiting."
          break
          ;;
        *)
          echo "You picked $FILENAME ($REPLY)"
          chmod go-rwx "$FILENAME"
          ;;
  esac
done
rm "$QUIT"

Подменю

Любая инструкция внутри select может быть еще одним циклом select, позволяющим добавить подменю.

По умолчанию, переменная PS3 не меняется, когда выполняется вход во вложенный цикл select. Если вы хотите, чтобы в подменю была другая строка приглашения, не забудьте во время присвоить ей нужное значение.


Предыдущий раздел: Оглавление Следующий раздел:
Команды break и continue   Встроенная команда shift