Библиотека сайта rus-linux.net
Руководство по 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 |