O principal problema está aqui:
read $input
No bash, geralmente, $foo
é o valor da variável foo
. Aqui, você não quer o valor, mas o nome da variável, por isso deve ser apenas:
read input
Da mesma forma, nos testes if
, $yes
e $no
devem ser apenas yes
e no
, pois você deseja apenas as strings yes
e no
.
Você pode usar uma declaração case
aqui, que (IMHO) facilita a realização de vários casos com base na entrada:
case $input in
[Yy]es) # The first character can be Y or y, so both Yes and yes work
echo "Hello!"
echo "Hello!" | festival --tts
;;
[Nn]o) # no or No
echo "Are you sure?"
echo "Are you sure?" | festival --tts
;;
*) # Anything else
echo "Please answer yes or no."
echo "Please answer yes or no." | festival --tts
;;
esac
Você pode agrupar as duas declarações echo
e o uso de festival
em uma função para evitar se repetir:
textAndSpeech ()
{
echo "$@"
echo "$@" | festival --tts
}
case $input in
[Yy]es) # The first character can be Y or y, so both Yes and yes work
textAndSpeech "Hello!"
;;
[Nn]o) # no or No
textAndSpeech "Are you sure?"
;;
*) # Anything else
textAndSpeech "Please answer yes or no."
;;
esac
Com $input
, o bash substitui isso pelo seu valor, que inicialmente não é nada, portanto, a execução do comando read
é:
read
E read
por padrão armazena a entrada na variável REPLY
. Então, se você quiser, elimine totalmente a variável input
e use $REPLY
em vez de $input
.
Também dê uma olhada em a declaração select
no Bash.