O principal problema com o seu script é que você testa a string literal order
para saber se é yes
ou não. Você provavelmente quis dizer "$order"
.
Outro problema é que você executa esse script, que é um script bash
, usando /bin/sh
. /bin/sh
pode não entender algumas das extensões que bash
faz para o padrão de shell POSIX, mas você também pode ter sorte. Altere a primeira linha para que bash
seja usado.
Uma comparação de string em um script de shell pode ser feita usando
if [ "$order" = "yes" ]; then ...; fi
Isto é "mais barato" e mais fácil de ler do que chamar grep
.
Você também pode usar case ... esac
:
case "$order" in
yes) ... ;;
no) ... ;;
esac
Re-executar o script para ter outra chance é frágil e muito pouco convencional. Será, por exemplo, muito provável que não funcione se o script for invocado como bash script.sh
. É melhor introduzir um loop que você interrompa se o usuário não quiser fazer outra.
bash
também tem um select
loop, que você pode usar assim:
echo 'Please select protein from this menu:'
select protein in "beans" "lentils" "tofu" "cheese"; do
if [ -z "$protein" ]; then
echo 'Invalid choice' >&2
else
printf 'You picked %s as protein\n' "$protein"
break
fi
done
Isso permite que você tenha maior controle sobre a entrada do usuário.
Uma abordagem geral para ler a entrada interativa de um usuário e, em seguida, perguntar sobre como sair ou não:
while true; do
read -p 'Enter data: ' -r data
# use "$data" here for something
read -p 'Again? [Y/n] ' answer
case "$answer" in
[Nn]*) break ;;
esac
done
Aqui, você tem um loop externo que faz as perguntas e faz algum processamento. Em seguida, ele pergunta ao usuário se deseja ir novamente. Se eles responderem "Não" (qualquer coisa que comece com N
ou n
), nós break
sairemos do loop.
O teste no final também pode ser uma validação de $data
. Se o usuário inseriu uma entrada inválida no primeiro read
, você pode querer perguntar novamente até que seja dada uma entrada válida.
O benefício disso é que $data
(ou o que você lê) está ativo e disponível após o loop de entrada, então, em vez de fazer processamento em $data
dentro do loop, você pode fazer isso mais tarde. >
pseudocódigo:
input-loop:
read-data
validate-data
if-valid exit input-loop
goto input-loop
main-code:
use-validated-data