计算 bash 内的表达式 for 循环

Evaluate expression inside bash for loop

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

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))

它只是在呼应文字,正如它所说的那样:

{12001..12500}

也就是“{"+12001+"..."+12500+"}"

不要使用 for 循环执行此操作。 {..} 符号不是那么灵活:

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

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

您可以使用 eval:

在算术扩展后强制进行重新扩展
for i in $(eval echo {$((1+(25-1)*500))..$((25*500))}); do echo $i;

试试这个

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

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.

的类似实用程序

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

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

改为尝试

我在seq $((1+(25-1)*500)) $((25*500));做 echo $i;完成