2

我想知道是否可以for i in {n..k}用变量编写“”循环。

例如;

for i in {1..5}; do
    echo $i
done

这输出

1
2
3
4
5

另一方面

var=5
for i in {1..$var}; do
    echo $i
done

印刷

{1..5}

如何使第二个代码与第一个代码一样运行?

ps 我知道有很多方法可以通过使用变量来创建循环,但我想具体询问一下这种语法。

4

3 回答 3

7

不能在{N..M}语法中使用变量。相反,你可以做的是使用 seq

$ var=5
$ for i in $(seq 1 $var) ; do echo "$i"; done
1
2
3
4
5

或者...

$ start=3
$ end=8
$ for i in $(seq $start $end) ; do echo $i; done
3
4
5
6
7
8
于 2013-07-22T12:34:08.627 回答
2

虽然seq很好,但如果 的值$var非常大,可能会导致问题,因为需要生成整个值列表,如果生成的命令行太长,可能会导致问题。bash还有一个 C 风格的 for 循环,它不会显式生成列表:

for ((i=1; i<=$var; i++)); do
    echo "$i"
done

(这也适用于常量序列,因为{1..10000000}还会生成一个非常大的列表,可能会溢出命令行。)

于 2013-07-22T13:03:29.963 回答
1

您可以eval为此使用:

$ num=5
$ for i in $(eval echo {1..$num}); do echo $i; done
1
2
3
4
5

使用前请阅读缺点eval

于 2013-07-22T13:35:46.330 回答