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

man-seq简介

$ seq [-w] [-f format] [-s string] [-t string] [first [incr]] last

语法

完整命令seq第一次递增最后一次

first是序列中的起始编号[可选,默认为:1]incr是增量[是可选的,默认为:1]last是序列中的最后一个数字

例子:

$ seq 1 2 10
1 3 5 7 9

仅使用第一个和最后一个:

$ seq 1 5
1 2 3 4 5

仅最后一个:

$ seq 5
1 2 3 4 5

使用{first..last..incr}

这里第一个和最后一个是强制性的,incr是可选的

只使用第一个和最后一个

$ echo {1..5}
1 2 3 4 5

使用incr

$ echo {1..10..2}
1 3 5 7 9

您甚至可以对以下字符使用此选项

$ echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z

其他回答

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将它们视为算术。

有很多方法可以做到这一点,但我更喜欢的方法如下

使用seq

man-seq简介

$ seq [-w] [-f format] [-s string] [-t string] [first [incr]] last

语法

完整命令seq第一次递增最后一次

first是序列中的起始编号[可选,默认为:1]incr是增量[是可选的,默认为:1]last是序列中的最后一个数字

例子:

$ seq 1 2 10
1 3 5 7 9

仅使用第一个和最后一个:

$ seq 1 5
1 2 3 4 5

仅最后一个:

$ seq 5
1 2 3 4 5

使用{first..last..incr}

这里第一个和最后一个是强制性的,incr是可选的

只使用第一个和最后一个

$ echo {1..5}
1 2 3 4 5

使用incr

$ echo {1..10..2}
1 3 5 7 9

您甚至可以对以下字符使用此选项

$ echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z

将{}替换为(()):

tmpstart=0;
tmpend=4;

for (( i=$tmpstart; i<=$tmpend; i++ )) ; do 
echo $i ;
done

产量:

0
1
2
3
4

您可以使用

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

如果您使用BSD/OSX,您可以使用jot而不是seq:

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