Bash for loop com intervalo {# .. #}

17

O {# .. #} gera uma sequência de números ou caracteres, da mesma forma que range () no Python. Se eu executar o comando echo {1..5}na linha de comando, tenho:

1 2 3 4 5

Em vez disso, o seguinte script bash não funciona conforme o esperado.

for i in {1..3};
do
    echo "Iteration $i"
done

irá imprimir:

Iteration {1..3}

Por quê?
* Eu poderia usar, seqmas li que está desatualizado ( http://www.cyberciti.biz/faq/bash-for-loop/ )

Shake0
fonte
Este erro ocorre se o script for executado pelo comando "sh" (tente usar "bash").
Shake0

Respostas:

22

Eu tentei o seu código (copiar e colar em um terminal) e ele produziu um resultado diferente do que você postou:

for i in {1..3};
do
    echo "Iteration $i"
done
#---OUTPUT BELOW---
Iteration 1
Iteration 2
Iteration 3

Estou usando o Linux Mint 12 Lisa (derivado do Ubuntu) com o bash versão 4.2.10 (1)

zipizap
fonte
2
Você está certo! Pensei sh e do bash eram a mesma coisa ..
Shake0
11
não, bash e sh são bastante diferentes ... bash é mais capaz do que sh, foi feito sobre os ombros de sh :) embora ambos têm um bom grau de compatibilidade, eles também têm suas diferenças
zipizap
note que você pode fazer listas aninhadas como para var em {{i..j}, {l..m}}; echo $ var; feito se precisar de uma sequência irregular, como 1 2 3 7 8 9
marrom.2179
Observe que em algumas distros está /bin/shrealmente apontando para o bash, no Debian e no Ubuntu está normalmente apontando para o /bin/dashque é principalmente compatível com POSIX, mas não suporta a mesma sintaxe do Bash.
dragon788