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