Não sei ao certo como o fluxo deve ficar no seu código, por isso darei duas versões:
-
O usuário adivinha até adivinhar corretamente a palavra atual no arquivo, depois passa para adivinhar a segunda palavra e assim por diante.
-
O usuário adivinha a palavra atual e passa para a próxima, independentemente de a suposição estar correta ou não.
A primeira variação:
exec 3<&1
n=0
while read word; do
n=$(( n + 1 ))
while true; do
printf 'Word #%d\n' "$n"
read -p 'guess the word: ' -u 3 guess
if [ "$guess" = "$word" ]; then
echo 'correct'
break
fi
echo 'wrong, try again'
done
done <words
exec 3<&-
Não podemos apenas read
dentro do loop, pois isso seria lido no arquivo . Em vez disso, lemos do filedescriptor 3, que é uma cópia da entrada padrão feita antes do loop. Após o loop, esse filedescriptor é fechado.
O loop while
interno itera até que uma estimativa correta seja feita.
A segunda variação:
exec 3<&1
n=0
while read word; do
n=$(( n + 1 ))
printf 'Word #%d\n' "$n"
read -p 'guess the word: ' -u 3 guess
if [ "$guess" = "$word" ]; then
echo 'correct'
else
echo 'wrong, next word...'
fi
done <words
exec 3<&-
Isso é semelhante ao código anterior, mas sem o loop while
interno.