当范围由变量给定时,如何在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}
当前回答
seq方法是最简单的,但Bash具有内置的算术求值。
END=5
for ((i=1;i<=END;i++)); do
echo $i
done
# ==> outputs 1 2 3 4 5 on separate lines
for((expr1;expr2;expr3));构造的工作原理与C语言和类似语言中的for(expr1;expr2;expr3)相同,并且与其他((expr))情况一样,Bash将它们视为算术。
其他回答
将{}替换为(()):
tmpstart=0;
tmpend=4;
for (( i=$tmpstart; i<=$tmpend; i++ )) ; do
echo $i ;
done
产量:
0
1
2
3
4
如果您使用BSD/OSX,您可以使用jot而不是seq:
for i in $(jot $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
seq方法是最简单的,但Bash具有内置的算术求值。
END=5
for ((i=1;i<=END;i++)); do
echo $i
done
# ==> outputs 1 2 3 4 5 on separate lines
for((expr1;expr2;expr3));构造的工作原理与C语言和类似语言中的for(expr1;expr2;expr3)相同,并且与其他((expr))情况一样,Bash将它们视为算术。
for i in $(seq 1 $END); do echo $i; done
编辑:比起其他方法,我更喜欢seq,因为我能记住它;)