Eu tenho o seguinte script bash:
#!/bin/bash
upperlim=10
for i in {0..10}
do
echo $i
done
for i in {0..$upperlim}
do
echo $i
done
O primeiro for
loop ( sem a variável upperlim
no controle do loop) funciona bem, mas o segundo for
loop ( com a variável upperlim
no controle do loop) não. Existe alguma maneira de modificar o segundo for
loop para que ele funcione? Obrigado pelo seu tempo.
bash
shell
shell-script
for
Andrew
fonte
fonte
for i in {0..$((upperlim))}; do echo $i; done
não funcionaRespostas:
A razão para isso é a ordem na qual as coisas ocorrem no bash. A expansão de chaves ocorre antes que as variáveis sejam expandidas. Para atingir seu objetivo, você precisa usar o estilo C para loop:
fonte
zsh
bem (mas não paracsh
,tcsh
).Para concluir isso no seu estilo usando nada além de embutidos, você teria que usar eval:
Mas com
seq
:Pessoalmente, acho o uso de
seq
mais legível.fonte
seq
é um comando externo e não está disponível em qualquer lugar do bash.seq
", reconhecendo que não é um built-in.read
é um builtin por exemplo, mas não há razão paraeval
isso.A maneira POSIX
Se você se preocupa com portabilidade, use o exemplo do padrão POSIX :
Resultado:
Coisas que não são POSIX:
(( ))
sem dólar, embora seja uma extensão comum, como mencionado pelo próprio POSIX .[[
.[
é suficiente aqui. Consulte também: https://stackoverflow.com/questions/13542832/bash-if-difference-between-square-brackets-and-double-square-bracketsfor ((;;))
seq
{start..end}
, e isso não pode funcionar com variáveis, conforme mencionado no manual do Bash .let i=i+1
: POSIX 7 2. A linguagem de comandos do shell não contém a palavralet
e falha nobash --posix
4.3.42i=$i+1
pode ser necessário o dólar em , mas não tenho certeza. O POSIX 7 2.6.4 Expansão aritmética diz:mas lê-lo literalmente que não implica que se
$((x+1))
expanda, poisx+1
não é uma variável.fonte
Sua abordagem não funcionará, pois na expansão do suporte do bash ocorre antes da expansão do parâmetro. Você precisa expandir a variável antes.
Você pode contornar o eval :
Com o loop While :
Além disso, você pode fazê-lo com o comando seq :
Se você quiser correr com
for i in {0..$upperlim}
você, precisará usar o kornshell. por exemplo:fonte