如何在bash中使用步骤n产生范围?(以递增的方式生成数字序列)


143

迭代bash范围的方法是

for i in {0..10}; do echo $i; done

用一个步骤迭代序列的语法是什么?说,在上述示例中,我只想获得偶数。


偶数,将i乘以
乔伊·罗伯特

我应该说乘法很难看
SilentGhost

2
@无礼我不确定。例如,OS X仍带有3.2。我想说应该接受C风格的循环。
Eli Korvigo

Answers:


195

我会做

for i in `seq 0 2 10`; do echo $i; done

(尽管当然seq 0 2 10会自行产生相同的输出)。

请注意,它seq允许浮点数(例如seq .5 .25 3.5),但bash的大括号扩展仅允许整数。


4
我会猜测,投票否定是由于您的回答对“ sh”通用,而不是对“ bash”特定。单纯的Bash方法{begin end step}的执行效果要好一些。较旧的“ seq”方法在较旧或较小内存的系统(如busybox)上很方便。我确实赞成您和TheBonsai的回答。:)
Scott Prive

6
最好将$(...)放在反引号中。反引号不会理智地嵌套。
全天

seq 1000000 1000010实际上只是浮点数-没有办法让它做整数!支撑扩展工程。
hmijail哀悼

112

Bash 4的大括号扩展具有步进功能:

for {0..10..2}; do
  ..
done

无论是Bash 2/3(C风格的循环,请参见上面的答案)还是Bash 4,我都希望使用比'seq'命令更合适的东西。


1
和btw,您知道bash4是否在任何主要操作系统上都是默认设置吗?
SilentGhost

3
Bash4仍然不是主流,不。为什么不序列?好吧,我们用IRC频道#bash中的bot话来说:“ seq(1)是一种非常不标准的外部命令,在愚蠢的Linux howtos中用来计数到10。”
TheBonsai

我的理解是seq是coreutils的一部分。这是什么非标准?争论?谢谢你的帮助。
SilentGhost

4
这些参数可能对您没有影响:*有足够的系统没有GNU coreutils(但安装了Bash)*创建了不需要的外部进程*您依靠所有'seq'都执行'seq'所要做的工作*未通过ISO标准化
TheBonsai

3
@becko如果步骤存储在变量中i,那么您将无法执行for {0..10..${i}}
Nehal J Wani 2014年

72

纯Bash,无需额外的过程:

for (( COUNTER=0; COUNTER<=10; COUNTER+=2 )); do
    echo $COUNTER
done

10
+1,因为该步骤也可以用变量替换。
Nehal J Wani 2014年

1
我认为这确实是大多数人可能想要的-一种简单的方法来按规定的步长值进行循环。它听起来比所有基于seq的答案都要简单,并且语法比Bash4大括号扩展更清晰,并且看起来它可以允许使用变量(我没有尝试过,但是语法确实表明了这一点)。
tobylaroni

与@TheBonsai的答案不同,它可以在Bash 3中工作。
srcerer

它甚至可以解析变量(((i =“ $ first”; i <=“ $ last”; i + =“ $ step”))。花括号和seq不太容易。
Blaa_Thor,

20
#!/bin/bash
for i in $(seq 1 2 10)
do
   echo "skip by 2 value $i"
done

seq是一个Linux命令。这在Mac OS X或FreeBSD上将不可用。
Dereckson

5
FWIW序列可在我的标准OS X 10.9.1小牛
马克·瑟特查

我尝试了一些其他的sintax,但这是唯一在一点CentOS上为我工作的方法。@z-保存了我的一天:D
m3nda 2014年

3
> seq 4
1
2
3
4

> seq 2 5
2
3
4
5

> seq 4 2 12
4
6
8
10
12

> seq -w 4 2 12
04
06
08
10
12

> seq -s, 4 2 12
4,6,8,10,12
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.