【发布时间】:2013-06-24 09:33:20
【问题描述】:
如何在 for 循环数字中使用变量?
例如:
num="12"
for i in {0..$num}; do
...
done
【问题讨论】:
如何在 for 循环数字中使用变量?
例如:
num="12"
for i in {0..$num}; do
...
done
【问题讨论】:
使用变量的大括号扩展并不像预期的那样工作(请参阅附录 B 了解详细信息),即 {0..$num} 只会返回 {0..12},而不是数字列表。
试试seq,像这样:
num="12"
for i in $(seq 0 $num); do
echo $i
done
bash manual 说,
扩展的顺序是:大括号扩展、波浪号扩展、参数、变量、算术扩展和命令替换(以从左到右的方式进行)、分词和文件名扩展。
在 shell 扩展 {0..$num}(大括号扩展)时,$num 尚未扩展(变量扩展)。序列表达式a..b 需要a 和b 都是数字来生成序列,但这里我们有一个数字和一个非数字(文字字符串$num)。如果做不到这一点,shell 会退回到字面上解释 {0..$num} 。然后变量展开接管,最后我们得到{0..12}
【讨论】:
brace expansion 报告为 {1..12} 而不是 {1..$num} 失败后,$num 将会扩大,但我想 OP 现在将获得更大的图景。
Bash 大括号扩展 之前 变量扩展,所以你会得到像{1..12}这样的输出.使用eval 可以让它工作。
$ 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
【讨论】:
eval 和 evil 甚至听起来很像!