Eu consegui o seguinte para trabalhar:
for i in {2..10}
do
echo "output: $i"
done
Ela produz um grupo de linhas de output: 2
, output: 3
, assim por diante.
No entanto, tentando executar o seguinte:
max=10
for i in {2..$max}
do
echo "$i"
done
produz o seguinte:
output: {2..10}
Como faço para o compilador perceber que ele deve tratar $ max como a outra extremidade da matriz, e não parte de uma string?
echo "$i
deveria serecho "$i"
- não vai resolver o problema, no entanto.do
ethen
na mesma linha quefor
eif
, respectivamente. Por exemplo,for i in {2..10}; do
Respostas:
A expansão de chaves , {x..y} é executada antes de outras expansões, portanto, você não pode usá- las para sequências de comprimento variável.
Em vez disso, use o
seq 2 $max
método como o usuário mob declarou .Então, para o seu exemplo, seria:
fonte
seq
contar e incrementar números no loop for, portanto, é recomendável evitar o usoseq
. Este comando é deixado para compatibilidade com o bash antigo. Os comandos internos são rápidos o suficiente.for (( EXP1; EXP2; EXP3 )) ...
for (( ... ))
sintaxe não é POSIX e isso significa, por exemplo, que não funcionará imediatamente em coisas como o Alpine Linux.seq
faz.#!/bin/sh
é Dash no Debian / Ubuntu.Experimente a versão de expressão aritmética de
for
:Está disponível na maioria das versões do bash e também deve ser compatível com o Bourne shell (sh).
fonte
sh
, tornando-o um link para outro outro shell. Idealmente, tal shell invocado comosh
seria única apoiar essas características no padrão POSIX, mas por padrão deixar alguns de seus recursos extras completamente. O loop for do estilo C não é um recurso POSIX, mas pode estar nosh
modo pelo shell real.Pise o loop manualmente:
Se você não precisa ser totalmente POSIX, pode usar o loop for aritmético :
Ou use jot (1) em sistemas BSD:
fonte
true $(( i++ ))
não funciona em todos os casos; portanto, a maioria dos portáteis seriatrue $((i=i+1))
.Há mais de uma maneira de fazer isso.
fonte
eval
avaliará tudo o que você definirmax
. Consideremax="2}; echo ha; #"
e substituaecho ha
por algo mais destrutivo.Se o
seq
comando disponível no seu sistema:Caso contrário, use o homem pobre
seq
comperl
:Assista essas aspas.
fonte
Esta é uma maneira:
Bash:
O modo Bash acima funcionará para
ksh
ezsh
também quandobash -c
for substituído porksh -c
ouzsh -c
respectivamente.Nota:
for i in {2..${max}}; do echo $i; done
trabalha emzsh
eksh
.fonte
Podemos iterar o loop como na programação C.
fonte
Aqui ele trabalhou no Mac OS X.
Inclui o exemplo de uma data BSD, como incrementar e diminuir a data também:
fonte
Bem, como não tinha o
seq
comando instalado no meu sistema (Mac OS X versão 10.6.1 (Snow Leopard)), acabei usando umwhile
loop:* Encolhe os ombros * O que quer que funcione.
fonte
Todos eles fazem
{1..8}
e devem ser POSIX. Eles também não serão interrompidos se você colocar uma condicionalcontinue
no loop. O caminho canônico:Outra maneira:
e outro:
fonte
Usar:
Você precisa da chamada explícita 'eval' para reavaliar o {} após a substituição da variável.
fonte