Estou aprendendo Bash e estou tentando resolver um exercício.
O exercício consiste em selecionar o nome e o sobrenome, em uma lista de menu. No entanto, se o nome não estiver na lista, defina a entrada manual.
Mas estou um pouco confuso porque não quando uma opção é selecionada, como ir para o segundo menu, sem selecionar a opção Sair (tento adicionar Break em qualquer opção, mas não funciona).
Para a entrada manual, tente ler a entrada do usuário, mas não vê nenhuma sugestão de trabalho?
Como posso encerrar o loop quando obtiver o nome e o sobrenome? Porque quando consigo os dois, chego ao mesmo loop.
echo -e "Choose your name Exercise #2 \n"
PS3='Please enter your name from the List: '
options=("Elvis" "John" "Mark" "Manual Input" "Quit")
select opt in "${options[@]}"
do
case $opt in
"Option 1")
;;
"Option 2")
;;
"Option 3")
;;
"Option 4")
echo "Sorry your Name is not in the List Give your name"
read -e -p "Whats your name: " MANUALINPUT
;;
"Quit")
break
;;
esac
echo "Hello $opt Next Step is Select your Lastname "
done
PS4='Please enter your last name from the List: '
options2=("Smith" "Brown" "Miller" "Manual Input" "Quit")
select opt2 in "${options2[@]}"
do
case $opt2 in
"Option 1")
;;
"Option 2")
;;
"Option 3")
;;
"Option 4")
echo "Sorry your Name is not in the List Give your name"
read -e -p "Whats your name: " MANUALINPUT
;;
"Quit")
break
;;
esac
clear
echo "Welcome $opt $opt2"
done
Responder1
O select
loop seria definido opt
para a opção escolhida pelo usuário e definido $REPLY
para o que o usuário digitou. Portanto, se o usuário digitou 1
como resposta à sua primeira pergunta, $REPLY
seria 1
e $opt
seria Elvis
. Em nenhum momento $opt
seria Option 1
. Torna mais fácil escrever suas case
declarações para teste, $REPLY
em vez de $opt
.
Além disso, é muito cedo para cumprimentar a pessoa pelo nomedentroo select
loop, pois talvez ainda não tenhamos certeza de que temos um nome real para eles. O código entre o final da case
instrução e o done
final do select
loop é executado quando o usuário escolhe uminválidoescolha no menu (você também pode fazer isso com uma *)
etiqueta de caixa).
Seria melhor usar nomes de variáveis mais descritivos, como name
and family
, e não precisamos de dois arrays separados para armazenar as opções (na verdade, é questionável se você precisa de arrays neste caso, pois poderíamos listar as strings diretamente) .
No código abaixo, também fiz o código terminar com exit
if o usuário escolher Quit
( break
sai do select
loop e o usamos quando o usuário escolhe um nome com sucesso). Todo o diálogo interativo acontece no fluxo de erros padrão, como é comum.
#!/bin/bash
PS3='Please enter your name from the list: '
options=("Elvis" "John" "Mark" "Manual input" "Quit")
select name in "${options[@]}"; do
case $REPLY in
1|2|3)
break # user picked name from list
;;
4)
echo 'Sorry your name is not in the list' >&2
read -e -r -p "What's your name: " name
break
;;
5)
echo 'Bye!' >&2
exit
;;
esac
echo 'Try again!' >&2
done
printf 'Hello %s, now select your family name\n' "$name" >&2
PS3='Please enter your family name from the list: '
options=("Smith" "Brown" "Miller" "Manual input" "Quit")
select family in "${options[@]}"; do
case $REPLY in
1|2|3)
break # user picked name from list
;;
4)
echo 'Sorry your family is not in the list' >&2
read -e -r -p "What's your family: " family
;;
5)
echo 'Bye!' >&2
exit
;;
esac
echo 'Try again!' >&2
done
printf 'Welcome, %s %s!\n' "$name" "$family"
Outras pequenas coisas corrigidas: Use -r
with read
para poder ler as barras invertidas corretamente, e você usou PS4
em vez de PS3
para definir o prompt de seleção no segundo loop.