关于linux:for循环数字的变量

Variable in for loop digits

本问题已经有最佳答案,请猛点这里访问。

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

例如:

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


使用变量进行扩展扩展并不像预期的那样工作(有关详细信息,请参见附录B),即{0..$num}只会字面返回{0..12}而不是数字列表。

尝试seq,而不是这样:

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

附录B:多汁的细节

bash手册说,

The order of expansions is: brace expansion, tilde expansion, parameter, variable, and arithmetic expansion and command substitution (done in a left-to-right fashion), word splitting, and filename expansion.

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


Bash在变量扩展之前进行扩展,因此您将获得{1..12}之类的输出。 使用eval,您可以使用它。

测试:

1
2
3
4
5
6
7
8
9
$ 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伪装是邪恶的。