当范围由变量给定时,如何在Bash中迭代一系列数字?
我知道我可以做到这一点(在Bash文档中称为“序列表达式”):
for i in {1..5}; do echo $i; done
这给出了:
1.2.3.4.5.
然而,如何用变量替换任意一个范围端点?这不起作用:
END=5
for i in {1..$END}; do echo $i; done
哪些打印:
{1..5}
当范围由变量给定时,如何在Bash中迭代一系列数字?
我知道我可以做到这一点(在Bash文档中称为“序列表达式”):
for i in {1..5}; do echo $i; done
这给出了:
1.2.3.4.5.
然而,如何用变量替换任意一个范围端点?这不起作用:
END=5
for i in {1..$END}; do echo $i; done
哪些打印:
{1..5}
当前回答
您可以使用
for i in $(seq $END); do echo $i; done
其他回答
这在bash中运行良好:
END=5
i=1 ; while [[ $i -le $END ]] ; do
echo $i
((i = i + 1))
done
for i in $(seq 1 $END); do echo $i; done
编辑:比起其他方法,我更喜欢seq,因为我能记住它;)
另一层间接:
for i in $(eval echo {1..$END}); do
∶
如果你正在执行shell命令,并且你(像我一样)对流水线有着一种迷恋,那么这个命令很好:
seq 1$END | xargs-I{}echo}
我知道这个问题是关于bash的,但为了记录在案,ksh93更聪明,并按预期实现:
$ ksh -c 'i=5; for x in {1..$i}; do echo "$x"; done'
1
2
3
4
5
$ ksh -c 'echo $KSH_VERSION'
Version JM 93u+ 2012-02-29
$ bash -c 'i=5; for x in {1..$i}; do echo "$x"; done'
{1..5}