评估bash for循环中的表达式

时间:2015-02-20 06:56:55

标签: bash shell unix

如果我这样做,我会得到预期的结果。

for i in {125..129}; do echo $i; done
125
126
127
128
129

但是当我这样做的时候?我得到了一些东西。

for i in {$((1+(25-1)*500))..$((25*500))}; do echo $i; done

{12001..12500}

我希望在循环变量中传递一个变量,如$((1+($j-1)*500))

6 个答案:

答案 0 :(得分:2)

Bash的大括号扩展有局限性。你想要的是seq

for i in $( seq $((1+(25-1)*500)) $((25*500)) ); do echo $i; done

上述内容将循环显示从12001到12500的所有数字。

讨论

seq类似于bash的大括号:

$ echo {2..4}
2 3 4
$ echo $(seq 2 4)
2 3 4

seq的主要优点是它的参数不仅包括算术表达式,如上所示,还包括shell变量:

$ x=4; echo $(seq $((x-2)) $x)
2 3 4

相比之下,括号符号也不接受。

seq是一个GNU实用程序,可用于所有Linux系统以及最新版本的OSX。较旧的BSD系统可以使用名为jot的类似实用程序。

答案 1 :(得分:1)

Brace扩展是在参数,变量和算术扩展之前发生的第一次扩展。仅当..之前和之后的值为整数或单个字符时,才会出现..的扩展扩展。由于您的示例中的算术扩展尚未发生,因此它们不是单个字符或整数,因此不会发生大括号扩展。

使用eval进行算术扩展后,您可以强制重新展开:

for i in $(eval echo {$((1+(25-1)*500))..$((25*500))}); do echo $i;

答案 2 :(得分:1)

您的查询非常类似于: shell script "for" loop syntax

大括号扩展,{x..y}在其他扩展之前执行,因此你不能将它用于可变长度序列。

而是尝试

for seq $((1+(25-1)*500)) $((25*500));回声$ i;完成

答案 3 :(得分:0)

它正好回应了正如它所说的文字:

{12001..12500}

即“{”+12001 +“...”+ 12500 +“}”

答案 4 :(得分:0)

请勿使用for循环执行此操作。 {..}符号并不灵活:

i=$((1+(25-1)*500)); while test $i -le $((25*500)); do echo $((i++)); done

答案 5 :(得分:0)

试试这个

for (( i= $((1+(25-1)*500)); i<=$((25*500)); i++ )); do echo $i; done

或者

for i in $(seq $(( 1+(25-1)*500 )) $(( 25*500 )) ); do echo $i; done