Я создаю простой скрипт bash и хочу создать в нем меню выбора, например:
$./script
echo "Choose your option:"
1) Option 1
2) Option 2
3) Option 3
4) Quit
И по выбору пользователя я хочу, чтобы выполнялись разные действия. Я noob, пишущий для bash, я искал ответы в Интернете, но ничего конкретного не получил.
bash
command-line
scripts
Даниэль Родригес
источник
источник
seq 10 | fzf
. Недостатком является то, что fzf не установлен по умолчанию. Вы можете найти fzf здесь: github.com/junegunn/fzfОтветы:
Добавляйте
break
операторы везде, где вам нуженselect
цикл для выхода. Если abreak
не выполняется,select
оператор зацикливается, и меню отображается повторно.В третий вариант я включил переменные, которые устанавливаются
select
оператором, чтобы продемонстрировать, что у вас есть доступ к этим значениям. Если вы выберете его, он выведет:Вы можете видеть, что
$REPLY
содержит строку, которую вы ввели в приглашении. Он используется в качестве индекса в массиве,${options[@]}
как если бы массив был основан на 1. Переменная$opt
содержит строку из этого индекса в массиве.Обратите внимание, что варианты выбора могут быть простым списком непосредственно в
select
выражении, например так:но вы не можете поместить такой список в скалярную переменную из-за пробелов в одном из вариантов.
Вы также можете использовать глобирование файлов, если вы выбираете среди файлов:
источник
break
выход изselect
цикла. Вы можете добавитьbreak
куда угодно. Руководство Bash гласит: «Команды выполняются после каждого выбора до тех пор, пока не будет выполнена команда останова, после чего команда выбора завершится»../test.sh: line 9: syntax error near unexpected token
"Опция 1" './test.sh: строка 9: ` "Вариант 1")'`PS3
это приглашение дляselect
команды. Он используется автоматически и не требует явных ссылок.PS3
иselect
документация.$options
вcase
выражении). Я думаю, что использование значений лучше документирует функциональность разделовcase
заявления.Не новый ответ сам по себе , но так как нет ответа еще принято, вот несколько кодирования советы и рекомендации, как для выбора и Zenity:
Стоит отметить:
Оба будут зациклены, пока пользователь явно не выберет Выход (или Отмена для zenity). Это хороший подход для интерактивных меню сценариев: после выбора и выполнения действия снова открывается меню для другого выбора. Если выбор должен быть одноразовым, используйте только
break
послеesac
(подход zenity может быть дополнительно сокращен)Оба
case
основаны на индексе, а не на стоимости. Я думаю, что это легче кодировать и поддерживатьМассив также используется для
zenity
подхода.Опция «Выйти» не входит в число первоначальных, оригинальных опций. Он добавляется при необходимости, поэтому ваш массив остается чистым. В конце концов, «Выход» не нужен для zenity, пользователь может просто нажать «Отмена» (или закрыть окно), чтобы выйти. Обратите внимание, как оба используют один и тот же нетронутый массив параметров.
PS3
иREPLY
vars не может быть переименован.select
жестко запрограммирован, чтобы использовать их. Все остальные переменные в скрипте (opt, options, prompt, title) могут иметь любые имена, которые вы хотите, при условии, что вы делаете корректировкиисточник
case
структуру дляselect
версии , которую вы используете дляzenity
версии:case "$opt" in . . . "${options[0]}" ) . . .
(вместо$REPLY
и индексов1
,2
и3
).$REPLY
индексами и значениями.Используя
dialog
, команда будет выглядеть так:Поместив это в скрипт:
источник
TERMINAL=$(tty)
в верхней части моего сценария , а затем вCHOICE
определении переменного я изменил ,2>&1 >/dev/tty
чтобы2>&1 >$TERMINAL
избежать проблем с перенаправлением , если сценарий был запущен в другом терминале контекста.--backtitle
параметр?Вы можете использовать этот простой скрипт для создания опций
источник
У меня есть еще один вариант, который представляет собой смесь этих ответов, но что делает его приятным, так это то, что вам нужно всего лишь нажать одну клавишу, а затем сценарий продолжается благодаря
-n
опции чтения. В этом примере мы предлагаем выключить, перезагрузить или просто выйти из скрипта, используя вANS
качестве нашей переменной, и пользователю нужно только нажать E, R или S. Я также установил значение по умолчанию для выхода, поэтому, если нажата клавиша enter, тогда скрипт выйдет.источник
Так как это нацелено на Ubuntu, вы должны использовать любой бэкэнд debconf, настроенный для использования. Вы можете узнать бэкэнд debconf с помощью:
Если он говорит «диалог», то, скорее всего, использует
whiptail
илиdialog
. На Люсиде этоwhiptail
.Если это не поможет, используйте bash «select», как объяснил Деннис Уильямсон.
источник
источник
$
отсутствует в$opt
переменной вwhile
заявлении.if
Заявление является излишним. Несовместимый отступ. Использованиеmenu
в некоторых местах, где это должно быть 'show_menu.
show_menu`, может быть помещено в верхнюю часть цикла вместо того, чтобы повторяться в каждомcase
. Несовместимый отступ. Смешивание использовать одинарные квадратные скобки и двойные. Использование жестко закодированных последовательностей ANSI вместоtput
. Использование имен всех заглавных букв не рекомендуется.FGRED
должен быть названbgred
. Использование обратных галочек вместо$()
. Определение функции должно быть последовательным и не использовать ...\n
никогда не будет выполнен. Возможно больше.Я использовал Zenity, который, кажется, всегда есть в Ubuntu, работает очень хорошо и имеет много возможностей. Это эскиз возможного меню:
источник
Bash необычное меню
Попробуйте сначала, а затем посетите мою страницу для подробного описания ... Нет необходимости во внешних библиотеках или программах, таких как диалог или zenity ...
источник
Там уже тот же вопрос в ответе сервера . Решение там использует хлыст .
источник
Предполагая, что вы хотите использовать простое меню сценария оболочки (без необычного пользовательского интерфейса), посмотрите пример меню на http://www.tldp.org/LDP/abs/html/testbranch.html .
источник