Bash (Ubuntu) - Strings em loops while?

6

Estou tentando criar um loop while no bash que não continuará até que o usuário insira a palavra "next". Eu não consigo descobrir como usar strings para a condição embora.

#Beginning of code
echo -e "Please type next to continue."
read word 
while [ "$word" -ne "next" ]
do 
    read word
done
#the rest of the code
    
por RootFAIL 13.02.2015 / 07:02

4 respostas

4

Como outros afirmaram, você não deve usar a comparação -ne integer para comparar strings. Em vez disso, use =/!= em test [ colchetes ] . Ainda assim, mesmo que seja frágil na melhor das hipóteses - as strings devem corresponder exatamente, e '' faz igual a '' . Geralmente, é melhor lidar com case s nesse contexto:

set --
while   read  word
        case $?$#$word            in 
        ($?$#[Nn][Ee][Xx][Tt]) ! :;;
        ([!0]*|05*) ! break       ;;esac
do      set '' "$@"
done   

Forneceu um valor padrão para $IFS (que vale a pena investigar se você planeja fazer o shell read s) , que deve funcionar para qualquer valor superior / inferior de next < em> (se você precisar) e evitar que o loop seja executado sem fim.

    
por 13.02.2015 / 07:55
7

Use != em vez de -ne

echo -e "Please type next to continue."
read word 
while [ "$word" != "next" ]
do 
    read word
done

Verifique isso para os operadores de comparação. link

    
por 13.02.2015 / 07:13
4

Eu acho que você quer:

echo 'Please type "next" to continue.'
while read word && [ "$word" != next ]; do
  : something in the loop if needed
done

É uma boa idéia também verificar o fim do arquivo no stdin (aqui, verificando o status de saída de read ).

    
por 13.02.2015 / 10:35
2

Você está usando o operador de comparação errado. Você deve usar "!=" Para string e "-ne" para inteiros da seguinte forma:

#Beginning of code
echo -e "Please type next to continue."
read word
while [ "$word" != "next" ]
do
    read word
done
#the rest of the code
Finalize esta página: Avançado bash Scripting: operações de comparação

    
por 13.02.2015 / 07:18