当范围由变量给定时,如何在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}


当前回答

如果您不想使用“seq”或“eval”或jot或算术扩展格式,例如for((i=1;i<=END;i++)),或其他循环,例如while,并且您不想只使用“printf”和“echo”,那么这个简单的解决方法可能适合您的预算:

a=1;b=5;d=‘对于{‘$a‘..‘$b‘}中的i;do echo-n“$i”;完成;'echo“$d”|bash

PS:反正我的bash没有“seq”命令。

在Mac OSX 10.6.8、Bash 3.2.48上测试

其他回答

您可以使用

for i in $(seq $END); do echo $i; done

如果你需要前缀,你可能会喜欢这个

 for ((i=7;i<=12;i++)); do echo `printf "%2.0d\n" $i |sed "s/ /0/"`;done

这将产生

07
08
09
10
11
12

我知道这个问题是关于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}

这是另一种方式:

end=5
for i in $(bash -c "echo {1..${end}}"); do echo $i; done
for i in $(seq 1 $END); do echo $i; done

编辑:比起其他方法,我更喜欢seq,因为我能记住它;)