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.