Bash-如何在范围括号中进行算术扩展?

Bash-如何在范围括号中进行算术扩展?,bash,shell,Bash,Shell,我想这样做: 对于{1..$2**3}中的i;不要重复$i;完成 但这将输出{1..8},我想执行它,而不是输出。 如何执行?在bash中不能这样做,大括号扩展发生在变量之前。 c风格的for循环也可以是一种选择 for ((i = 1; i <= 2**3; i++)); do printf '%d ' "$i"; done 有关扩展PAGER='less+/^expansion'man bash的顺序,请参阅本地bash手册,感谢@Freddy 请参阅本地bash手册中的eval P

我想这样做: 对于{1..$2**3}中的i;不要重复$i;完成

但这将输出{1..8},我想执行它,而不是输出。
如何执行?

在bash中不能这样做,大括号扩展发生在变量之前。 c风格的for循环也可以是一种选择

for ((i = 1; i <= 2**3; i++)); do printf '%d ' "$i"; done
有关扩展PAGER='less+/^expansion'man bash的顺序,请参阅本地bash手册,感谢@Freddy

请参阅本地bash手册中的eval PAGER='less+/^[:blank:][]*eval\'man bash


在bash中不能这样做,大括号扩展发生在变量之前。 c风格的for循环也可以是一种选择

for ((i = 1; i <= 2**3; i++)); do printf '%d ' "$i"; done
有关扩展PAGER='less+/^expansion'man bash的顺序,请参阅本地bash手册,感谢@Freddy

请参阅本地bash手册中的eval PAGER='less+/^[:blank:][]*eval\'man bash

您可以使用seq代替大括号:

for i in $(seq 1 $((2**3))); do echo "$i"; done
您可以使用seq代替大括号:

for i in $(seq 1 $((2**3))); do echo "$i"; done

1我在哪里可以找到,什么操作比其他操作先发生,也就是说,先发生的是什么扩展-执行流。2为什么它与eval一起工作?可以用subshell$完成吗?它是因为流动而起作用的吗?eval是否具有大括号的优先级?你能更详细地说明你的答案吗?没有子shell可以解决这个问题,扩展的顺序很重要,大括号在变量之前,这就是为什么{$var1..$var2}中的i不能给出预期的输出。嗯,eval可以做很多事情。其中一个是在不知情的情况下删除/中的所有内容…展开顺序是:大括号展开;以从左到右的方式进行波浪线展开、参数和变量展开、算术展开和命令替换;分词;和文件名扩展@牧民eval所做的是在通常的扩展序列之后,它获取结果并再次执行整个序列。所以在这种情况下,{1..$2**3}在第一个序列的算术展开步骤中变成{1..8},然后在第二个序列的大括号展开步骤中扩展到1 2 3 4 5 6 7 8。eval的基本问题是,正如您发现的那样,shell解析和扩展有些令人困惑,而执行两次则更令人困惑。您需要额外级别的引号和/或转义符,数据可以被视为语法等@GordonDavisson,1为什么eval会扩展整个命令行,而不仅仅是它后面的内容,也就是它的参数。2如果eval的使用更令人困惑,那么它的目的是什么,或者何时使用eval是有利的和有意义的?1我在哪里可以找到,什么操作比其他操作先发生,也就是说,什么扩展首先发生-执行流。2为什么它与eval一起工作?可以用subshell$完成吗?它是因为流动而起作用的吗?eval是否具有大括号的优先级?你能更详细地说明你的答案吗?没有子shell可以解决这个问题,扩展的顺序很重要,大括号在变量之前,这就是为什么{$var1..$var2}中的i不能给出预期的输出。嗯,eval可以做很多事情。其中一个是在不知情的情况下删除/中的所有内容…展开顺序是:大括号展开;以从左到右的方式进行波浪线展开、参数和变量展开、算术展开和命令替换;分词;和文件名扩展@牧民eval所做的是在通常的扩展序列之后,它获取结果并再次执行整个序列。所以在这种情况下,{1..$2**3}在第一个序列的算术展开步骤中变成{1..8},然后在第二个序列的大括号展开步骤中扩展到1 2 3 4 5 6 7 8。eval的基本问题是,正如您发现的那样,shell解析和扩展有些令人困惑,而执行两次则更令人困惑。您需要额外级别的引号和/或转义符,数据可以被视为语法等@GordonDavisson,1为什么eval会扩展整个命令行,而不仅仅是它后面的内容,也就是它的参数。2如果eval的用法更令人困惑,它的目的是什么,或者何时使用eval是有利的和有意义的?