如果我这样做,我会得到预期的结果。
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))
答案 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