expressão inteira esperada bash

4

Tentativa de loop uma frase inserida pelo usuário uma quantidade definida de vezes que também é inserida pelo usuário. Continue recebendo a expressão de erro inteiro esperada, e não consigo descobrir como corrigi-lo.

#!/bin/sh 
echo "What do you want to say?"
read phrase 

echo "How many times?"
read num

while [ "num" -ge 0 ]
do
     echo $phrase
     num='expr num - 1'
done
    
por user50017 27.10.2013 / 04:08

2 respostas

3

Você precisa usar um $ para expandir uma variável no bash, a menos que esteja dentro de (( )) . Você está comparando a string literal "num" com o número 0. Use um dos seguintes:

while [ "$num" -ge 0 ] # POSIX
while (( num >= 0 )); # bash
    
por 27.10.2013 / 04:23
1

Algumas correções.

#!/bin/sh
echo "What do you want to say?"
read phrase

echo "How many times?"
read num

while [ $num -gt 0 ];
do
     echo $phrase
     let num='num - 1'
done

Exemplo

$ ./cmd.bash 
What do you want to say?
hi
How many times?
4
hi
hi
hi
hi

Você pode tornar o recálculo de $num um pouco mais simplificado e mais fácil de ler com essa notação.

Altere esta linha:

     let num='num - 1'

com isso:

     ( num-- ))

É confuso quando usar ou não a notação $ para variáveis, geralmente você vai querer consultar a página de manual para bash e test ao fazer este tipo de trabalho. Esta mudança é apropriada se você estiver usando bash e não apenas nativo sh .

Detalhes

  1. Você precisa usar a forma variável de $num ao executar a verificação de limites na seção de controle while loops.
  2. Use let em vez de expr .
  3. O limite para o loop é incluir a etapa 0 com -ge , o que lhe dará mais 1 do que você deseja.

Exemplo

Com a verificação de limite de while loops usando -gt , você obtém esse resultado:

$ ./cmd.bash 
What do you want to say?
hi
How many times?
2
hi
1
hi
0

Se você usar seu -ge , verá este comportamento:

$ ./cmd.bash 
What do you want to say?
hi
How many times?
2
hi
1
hi
0
hi
-1
    
por 27.10.2013 / 04:21