在bash for循环中计算表达式

在bash for循环中计算表达式,bash,shell,unix,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它只是在回显文本,与它所说的完全相同: {12001..12500} 那就是{+12001+…+12500

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

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+}

它只是在重复文本,它说的正是:

{12001..12500}


也就是说{+12001+…+12500+}

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

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

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

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

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

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


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

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

试试这个

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

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

Bash的大括号扩展有局限性。您想要的是以下内容:

上面的循环将覆盖从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。

Bash的brace扩展有局限性。您想要的是以下内容:

上面的循环将覆盖从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。

您查询的功能非常类似于:

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

相反,尝试


对于序列号为$1+25-1*500$25*500的i;不要重复$i;完成

您查询的内容与以下内容非常相似:

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

相反,尝试


对于序列号为$1+25-1*500$25*500的i;不要重复$i;完成

1+25-1*500等于什么?它与python有什么关系?@AstraBear 1+25-1*500=12001:-P@Linguist是的,这是我的观点。见下面的答案。希望这会有所帮助。对于未来,你应该真正尝试在标题中描述问题,而不是一般的“请帮助”标题,这样回答者就可以更好地了解他们是否能提供帮助。1+25-1*500等于什么?它与python有何关系?@AstraBear 1+25-1*500=12001:-P@Linguist是的,这是我的观点。见下面的答案。希望这会有帮助。以后,你应该真正尝试在标题中描述问题,而不是一般的“请帮助”标题,以便回答者更好地了解他们是否能提供帮助。For循环可以看到重复的问题,但不能使用范围表示法。对于i,以$seq$1+25-1*500$25*500表示;不要重复$i;doneYou可以使用for循环,但不能像op尝试的那样使用大括号扩展。seq唯一的问题是它既不是便携的,也不是标准的。这仅仅是一个例子来展示另一种选择。for循环可以看到重复的问题,但不能使用范围表示法。对于i,以$seq$1+25-1*500$25*500表示;不要重复$i;doneYou可以使用for循环,但不能像op尝试的那样使用大括号扩展。seq唯一的问题是它既不是便携的,也不是标准的。这仅仅是一个展示替代方案的示例。