计算 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;完成
如果我这样做,我会得到预期的结果。
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;完成