SE dentro de UNTIL. Não está funcionando nenhuma sugestão! [fechadas]

0
selected=MU
team=xyz
until [ $selected = $team ]
do
    echo "Guess the best team:
    Manchester United->MU
    Arsenal      ->AR
    Chelsea      ->CH"
    read team
    if [ $selected -ne $team ]
        then
        echo "You are wrong!!! Try again"
    fi
done
echo "Correct!! Manchester united is the best"
    
por Gimmeray 09.12.2015 / 13:52

4 respostas

1

Eu tentei, primeiro eu peguei:

line 12: [: MU: integer expression expected

desde que ele estava tentando comparar strings mas inteiros esperados. Usar == e != funciona para strings ou como abaixo também.

Citando variáveis é uma boa ideia, caso alguém digite em um espaço, você receberá um erro diferente:

line 4: [: too many arguments

Então, basicamente, você precisa

until [ "$selected" == "$team" ]
...
   if [ ! "$selected" == "$team" ]
    
por Xen2050 09.12.2015 / 14:06
2

Resposta curta: Há um erro na linha 10. O operador -ne é para inteiros,! = é para strings.

A resposta longa segue.

Veja novamente a mensagem de erro.

test.sh: line 10: [: MU: integer expression expected

Esse colchete esquerdo é, na verdade, um comando que reside no seu sistema de arquivos, não um elemento sintático como muitos esperariam. Como a maioria dos comandos no * nix, tem uma página man que você pode verificar com:

man [

onde você encontrará a lista de todos os testes que pode fazer por você:

...
STRING1 != STRING2
  the strings are not equal
...
INTEGER1 -ne INTEGER2
  INTEGER1 is not equal to INTEGER2
...

Note que [ e teste são o mesmo comando e você provavelmente vai ver ambos ao longo de sua carreira.

O script do shell pode ser muito difícil no começo, mas não desanime, porque vale a pena.

Acho que a opção -x do bash é muito útil ao depurar scripts de shell. Quando usado, o bash exibe todos os comandos antes de executá-los.

$ bash -x test.sh
+ selected=MU
+ team=xyz
+ '[' MU = xyz ']'
+ echo 'Guess the best team:
    Manchester United->MU
    Arsenal      ->AR
    Chelsea      ->CH' Guess the best team:
    Manchester United->MU
    Arsenal      ->AR
    Chelsea      ->CH
+ read team MU
+ '[' MU -ne MU ']' test.sh: line 10: [: MU: integer expression expected
+ '[' MU = MU ']'
+ echo 'Correct!! Manchester united is the best' Correct!! Manchester united is the best
    
por vchoi 09.12.2015 / 15:45
0

Substituir

if [ $selected -ne $team ]

com

if [ $selected != $team ]

O operador -ne só pode comparar números, não sequências de caracteres.

    
por Florian Diesch 09.12.2015 / 14:01
0

há um erro na comparação de strings:

Erro: if [ $selected -ne $team ] esta é a comparação de números inteiros, para as cadeias: if [ $selected != $team ]

    
por LilloX 09.12.2015 / 14:01