bash variables no intervalo de loop [duplicado]

12

Eu quero imprimir uma lista de números de 1 a 100 e eu uso um loop for como o seguinte:

number=100
for num in {1..$number}
do
  echo $num
done

Quando executo o comando, ele imprime apenas {1..100} e não a lista de números de 1 a 100.

    
por coffeMug 26.08.2013 / 13:59

6 respostas

18

Sim, isso ocorre porque a expansão de chave ocorre antes da expansão do parâmetro. Use outro shell como zsh ou ksh93 ou use uma sintaxe alternativa:

Sintaxe sh padrão (POSIX)

i=1
while [ "$i" -le "$number" ]; do
  echo "$i"
  i=$(($i + 1))
done

Estilo do Ksh for ((...))

for ((i=1;i<=number;i++)); do
  echo "$i"
done

use eval (não recomendado)

eval '
  for i in {1..'"$number"'}; do
    echo "$i"
  done
'

use o comando GNU seq nos sistemas em que está disponível

unset -v IFS # restore IFS to default
for i in $(seq "$number"); do
  echo "$i"
done

(aquele que é menos eficiente, pois ele roda e executa um novo comando e o shell precisa ler sua saída de um pipe).

Evite loops em shells.

Usar loops em um script de shell é geralmente uma indicação de que você não está fazendo certo.

Provavelmente, seu código pode ser escrito de outra forma.

    
por 26.08.2013 / 14:12
6

Você nem precisa de um loop para isso, apenas use o comando seq :

$ seq 100

Exemplo

Aqui estão os primeiros 10 números sendo impressos:

$ seq 100 | head -10
1
2
3
4
5
6
7
8
9
10
    
por 26.08.2013 / 15:43
3

Você pode usar o seguinte:

for (( num=1; num <= 100; num++ ))
do
    echo $num
done
    
por 26.08.2013 / 14:12
1

A expansão de contraventamento funciona apenas para inteiros literais ou caracteres únicos. Isso acontece antes da expansão da variável, então você não pode usar variáveis nela.

    
por 26.08.2013 / 14:12
1

Também há um pré incremento.

for (( int=1; int <= 100; ++int));
  do
    printf '%s ' $int
  done

Use printf para imprimir os números em uma linha.

Outro exemplo para incrementar por 2

for (( int=1; int <= 100; int+=2));
  do
    printf '%s ' $int
  done
    
por 26.08.2013 / 14:21
1

Outra maneira de fazer isso simplesmente no script Bash (e parece que você estava fazendo)

number=100
for num in $(seq 1 $number); do
    echo $num;
done
    
por 26.08.2013 / 14:57

Tags