
Temos que fazer um script com um until
loop para pedir repetidamente um número ao usuário. - Se o número não for 50, exibe a mensagem “Número errado; tente novamente." - peça outro número. - Se o número for 50, exiba a mensagem “Você conseguiu!” E pare.
Aqui está o que tenho até agora:
echo -n "please choose a number: "
read number
until [$number -eq 50];
do
if [$number !=50]
then
echo "Wrong number; try again"
read wrong
else
echo -n "Please choose a number: "
read newnum
fi
done
Não sei como fazer o loop da instrução "Escolha um número". Sempre acabo com o erro:
syntax error near unexpected token 'fi'
Estive procurando on-line, mas não há exemplos claros de loops de entrada e saída ATÉ
Responder1
echo -n "please choose a number: "
read number
until [ $number -eq 50 ]
do
# if [ $number -ne 50 ]
# then
echo "Wrong number; try again"
read number
# fi
done
echo You got it\!
O primeiro read
lê em variável number
. O until
loop repete até $number
ser igual a 50.
O teste dentro do loop é desnecessário, pois until
só entra quando o número for -ne
(diferente de) 50.
O principal problema que você teve foi que read
dentro do loop deveria atualizar a mesma variável ( number
) que a until
construção verifica.
O espaçamento também é importante, porque a palavra (cercada por espaço em branco) depois if
é o nome de um comando. [$number
avalia o que foi inserido, mas prefixado por '[', que provavelmente não é o nome de um comando existente. Por exemplo, se a primeira estimativa fosse 42
, o if
comando tentaria executar o comando [42
, causando um erro como[42: not found
.
Além disso, a comparação de números é feita com -eq
, -lt
, -ge
, -gt
, -ge
, -ne
.
=
e =!
são para cordas.
Responder2
Na outra resposta, você recebeu alguns conselhos mais gerais sobre o seu programa, então vou apontar o erro real, que está de acordo com oif
if [$number !=50]
Deveria ser:
if [ $number -ne 50 ]
Eu mudei três coisas aqui
- Eu substituí
!=
por-ne
. O primeiro é inválido - Eu adicionei um espaço entre
[
e$number
. (Verifique corrigindo o primeiro passo o que acontece se não o fizer).
É claro que você recebe um programa estranho com comportamento inesperado, mas ele será executado :)
Responder3
Eu faria assim:
#!/usr/bin/env bash
while :; do
read -p "Please choose a number: " number
[ "$number" -eq 50 ] 2>/dev/null
case $? in
0) break ;;
1) echo "Wrong number; try again." ;;
2) echo "Not a valid number; try again." ;;
esac
done
echo "You got it!"
Onde while
pode ser substituído por until
, se desejar. Mas tenho a sensação de que o professornãofique satisfeito se as cordas musicais enviarem este programa. :)
Responder4
Seuerro de sintaxe próximo ao token inesperado 'fi'não pode ser explicado com o código que você postou, a menos que ambos then
sejam else
seguidos por caracteres invisíveis como um caractere CR (como quando os arquivos vêm do sistema operacional Microsoft, onde o delimitador de linha é CRLF em vez de apenas LF. Mas se fosse um arquivo formatado em DOS, eu esperaria outras mensagens de erro por causa do CR após do
e done
.
Editar: olhando o histórico de revisões da sua pergunta, o erro parece corresponder a um erro em umversão anterior do seu script.
Você tem vários erros com [
a sintaxe do seu comando, variáveis sem aspas, como já foi observado, mas gostaria de acrescentar que a sintaxe de um until
loop é:
until
condition-command-list
do
action-command-list
done
Pode condition-command-list
haver qualquer número de comandos como o action-command-list
, então você pode fazer
until
printf 'please choose a number: '
read number || [ -n "$number" ] || exit
[ "$number" -eq 50 ]
do
echo >&2 'Wrong number; try again'
done
A || exit
parte é sair do script no EOF (caso contrário, ele faria um loop para sempre se o stdout do script fosse fechado como quando você executa echo 49 | your-script
).