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

2

Precisamos criar um script com um loop until para perguntar repetidamente o usuário por um número. - Se o número não for 50, exiba 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 eu 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 dar a instrução "Por favor, escolha um número". Eu sempre acabo com o erro:

      syntax error near unexpected token 'fi' 

Estou procurando on-line, mas não há exemplos claros de saída de entrada UNTIL loops

    
por musicstrings 17.11.2014 / 08:35

5 respostas

2
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ê a variável number . O loop until faz um loop até $number ser igual a 50.

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

O principal problema que você teve foi que read dentro do loop deve atualizar a mesma variável ( number ) que a construção until verifica.

O espaçamento também é importante, porque a palavra (cercada por espaço em branco) depois de if é o nome de um comando. [$number avalia para o que quer que tenha sido inserido, mas prefixado por '[', que provavelmente não é o nome de um comando existente. Por exemplo, se o primeiro palpite fosse 42 , o comando if 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 strings.

    
por 17.11.2014 / 11:05
0

Na outra resposta, você tem um conselho mais geral sobre o seu programa, então vou mostrar o erro, que está na linha com o if

if [$number !=50]

Deve 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 você não o fizer).

É claro que você tem um programa estranho com comportamento inesperado, mas será executado:)

    
por 17.11.2014 / 11:18
0

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 desejado. Mas tenho a impressão de que o professor não ficaria satisfeito se os musicstrings submetessem este programa. :)

    
por 17.11.2014 / 11:27
0

Outra solução, concisa.

read -p "please choose a number: " number

until ((number == 50)); do
    read -p "Wrong number; try again : " number
done

echo "You got it!"
    
por 17.11.2014 / 23:01
0

Seu erro de sintaxe próximo ao token inesperado 'fi' não pode ser explicado com o código que você postou, a menos que then e else sejam seguidos por caracteres invisíveis como um caractere CR do Microsoft OS, 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 para o histórico de revisão da sua pergunta, o erro parece corresponder a um erro em um versão anterior do seu script .

Você tem vários erros com a sintaxe do comando [ , variáveis não citadas, como já foi observado, mas gostaria de acrescentar que a sintaxe de um loop until é:

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

O condition-command-list pode ser 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 parte || exit é sair do script no EOF (caso contrário, ele seria loop para sempre se o stdout do script fosse fechado como quando você executa echo 49 | your-script ).

    
por 03.10.2016 / 10:46