Я пытаюсь реализовать простое меню с помощью select
команды. Сценарий (для тестирования) выглядит следующим образом:
#!/bin/bash
echo "*******************"
PS3='Select an option and press Enter: '
options=("apache" "named" "sendmail")
select opt in "${options[@]}"
do
case $opt in
"apache")
date
;;
"named")
echo "test"
;;
"sendmail")
echo "test 2"
;;
*) echo "invalid option";;
esac
done
echo "*********************"
Скрипт не распознает какие-либо действительные входные данные, которые я даю, и всегда печатает сообщение «неверная опция» Что я делаю не так в этом сценарии?
bash
shell-script
select
Sumod
источник
источник
Ответы:
Ваше меню, отображаемое выбором, будет выглядеть так:
В это время вы вводите «1» или «2» или «3»: вы не вводите слово.
Кроме того,
select
будет зацикливаться, пока не увидитbreak
команду, поэтому вы хотите это:Если вы хотите разрешить пользователю вводить число или слово, вы можете написать это:
Запятая не имеет синтаксического значения, она просто для того, чтобы иметь возможность сопоставления с шаблоном либо для переменной $ REPLY (что именно ввел пользователь), либо для переменной $ opt
источник
select
Команда нуждается вbreak
неcase
.break
там в каждом разделе. Тем не менее, вы никогда не будете нуждаться вbreak
в случае ... ESAC блок в сценарии оболочки . Это может случиться так легко, чтобы смешать их. :-)break
дляcase
. Тем не менее, вам нужноbreak
избежатьselect
цикла.Ваша
$opt
переменная будет установлена в опциональное слово, соответствующее номеру, который вводит пользователь. Если вы хотите посмотреть, что на самом деле набрал пользователь, посмотрите$REPLY
.источник
case
сравниваются$opt
с «apache», «named» и «sendmail», это правильно и ничего менять не нужно.1
/2
/3
, и $ opt удерживаетapache
/named
/sendmail
$REPLY
это то, что набрал пользователь, и если это было допустимое число, то оно$opt
будет словом, соответствующим этому номеру.