3

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

例如:

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

2 回答 2

6

带有变量的大括号扩展并不像人们期望的那样工作(参见附录 B了解更多详细信息),即{0..$num}只会{0..12}按字面意思返回而不是数字列表。

试试seq这样:

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

附录 B:多汁的细节

bash手册说,

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

当时 shell 扩展{0..$num}(大括号扩展),$num尚未扩展(变量扩展)。序列表达式a..b需要ab都是数字来生成序列,但这里我们有一个数字和一个非数字(文字字符串$num)。如果做不到这一点,shell 就会退回到{0..$num}字面解释。然后变量展开接管,最后我们得到{0..12}

于 2013-06-27T02:49:24.243 回答
2

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是变相的邪恶

于 2013-06-27T03:31:25.213 回答