当范围由变量给定时,如何在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”或“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上测试
其他回答
如果你正在执行shell命令,并且你(像我一样)对流水线有着一种迷恋,那么这个命令很好:
seq 1$END | xargs-I{}echo}
将{}替换为(()):
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
这是另一种方式:
end=5
for i in $(bash -c "echo {1..${end}}"); do echo $i; done
有很多方法可以做到这一点,但我更喜欢的方法如下
使用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