Estou tentando implementar um menu simples usando o select
comando O script (para fins de teste) é o seguinte:
#!/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 "*********************"
O script não reconhece nenhuma entrada válida fornecida e sempre imprime a mensagem "opção inválida". O que estou fazendo de errado neste script?
bash
shell-script
select
Sumod
fonte
fonte
Respostas:
Seu menu mostrado por select será parecido com:
Nesse momento, você insere "1" ou "2" ou "3": não digita a palavra.
Além disso,
select
fará um loop até encontrar umbreak
comando, então você deseja o seguinte:Se você deseja permitir que o usuário digite o número ou a palavra, você pode escrever o seguinte:
A vírgula não tem significado sintático, apenas existe para poder padronizar a correspondência na variável $ REPLY (que é o que o usuário realmente digitou) ou na variável $ opt
fonte
select
comando precisa de umbreak
, nãocase
.break
lá em todas as seções. No entanto, você nunca vai precisar de umbreak
em um caso ... esac bloco em um script shell . Isso pode acontecer tão facilmente para misturá-los. :-)break
paracase
. No entanto, você precisa de umbreak
para escapar doselect
loop.Sua
$opt
variável será configurada para a palavra de opção correspondente ao número que o usuário digitar. Se você quiser ver o que o usuário realmente digitou, veja$REPLY
.fonte
case
compara$opt
com "apache", "nomeado" e "sendmail", está correto e nada precisa ser alterado.1
/2
/3
, e $ opt mantémapache
/named
/sendmail
$REPLY
é o que o usuário digitou e, se fosse um número válido,$opt
será a palavra correspondente a esse número.