Linux 循环数字中的变量

Linux 循环数字中的变量,linux,bash,Linux,Bash,如何在循环数字中使用变量 例如: num="12" for i in {0..$num}; do ... done 带有变量的大括号扩展并不像人们预期的那样工作(有关详细信息,请参见附录B),即{0..$num}只会返回{0..12},而不是一个数字列表 请尝试如下操作: num="12" for i in $(seq 0 $num); do echo $i done 附录B:有趣的细节 国王说 展开顺序为:大括号展开、平铺展开、参数展开、变量展

如何在循环数字中使用变量

例如:

num="12"
for i in {0..$num}; do
        ...
done

带有变量的大括号扩展并不像人们预期的那样工作(有关详细信息,请参见附录B),即
{0..$num}
只会返回
{0..12}
,而不是一个数字列表

请尝试如下操作:

num="12"
for i in $(seq 0 $num); do
    echo $i
done

附录B:有趣的细节 国王说

展开顺序为:大括号展开、平铺展开、参数展开、变量展开、算术展开和命令替换(以从左到右的方式完成)、分词和文件名展开


在shell展开时,
{0..$num}
(大括号展开),
$num
尚未展开(变量展开)。序列表达式
a..b
需要
a
b
都是数字才能生成序列,但这里我们有一个数字和一个非数字(文本字符串
$num
)。如果做不到这一点,shell将返回到按字面解释
{0..$num}
。然后变量扩展接管,最后我们得到
{0..12}
变量扩展之前进行大括号扩展,因此您将得到类似
{1..12}
的输出。使用
eval
可以使其工作

测试:
请注意:

大括号扩展不支持变量(不完全正确:)@JS웃, 是的,措辞是错误的。我添加了一个更合适的解释。更新和添加的解释+1。虽然有轻微的修正,$num将在一次失败的
大括号扩展后被扩展为
{1..12}
,而不是
{1..$num}
,但我想OP现在可以看到更大的图景了。
eval
evil
听起来很像!
$ num=5
$ for i in {1..$num}; do echo "$i"; done
{1..5}
$ for i in $(eval echo {1..$num}); do echo "$i"; done
1
2
3
4
5