Você pode colocar uma instrução if dentro de um loop até?

Você pode colocar uma instrução if dentro de um loop até?

Temos que fazer um script com um untilloop 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 readlê em variável number. O untilloop repete até $numberser igual a 50.

O teste dentro do loop é desnecessário, pois untilsó entra quando o número for -ne(diferente de) 50.

O principal problema que você teve foi que readdentro do loop deveria atualizar a mesma variável ( number) que a untilconstrução verifica.

O espaçamento também é importante, porque a palavra (cercada por espaço em branco) depois ifé o nome de um comando. [$numberavalia 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 ifcomando 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 whilepode 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 thensejam elseseguidos 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 doe 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 untilloop é:

until
  condition-command-list
do
  action-command-list
done

Pode condition-command-listhaver 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 || exitparte é 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).

informação relacionada