如何在 bash 中生成步骤 n 的范围? (生成带增量的数字序列)
Posted
技术标签:
【中文标题】如何在 bash 中生成步骤 n 的范围? (生成带增量的数字序列)【英文标题】:How to produce a range with step n in bash? (generate a sequence of numbers with increments) 【发布时间】:2010-11-01 05:58:30 【问题描述】:在 bash 中迭代一个范围的方法是
for i in 0..10; do echo $i; done
使用步骤迭代序列的语法是什么?比如说,我想在上面的例子中只得到偶数。
【问题讨论】:
偶数,将 i 乘以 2。:P 乘法比较难看,应该说 @Omnifarious 我不太确定。例如,OS X 仍然带有 3.2。我想说应该接受 C 风格的循环。 【参考方案1】:我愿意
for i in `seq 0 2 10`; do echo $i; done
(当然seq 0 2 10
会自己产生相同的输出)。
请注意,seq
允许浮点数(例如,seq .5 .25 3.5
),但 bash 的大括号扩展只允许整数。
【讨论】:
我会冒险猜测,否决票是由于您的回答对“sh”是通用的,而不是特定于“bash”。纯 Bash 方法 begin end step 性能稍好一些。较旧的“seq”方法在较旧或较小内存的系统(如busybox)上很方便。我确实赞成您和 TheBonsai 的回答。 :) 首选 $(...) 而不是反引号。反引号不能合理嵌套。 seq 1000000 1000010 实际上只做浮点数 - 没有办法让它做整数!大括号扩展有效。 如何将结果(输出)保存到文件中?【参考方案2】:Bash 4的大括号扩展有一个step特性:
for 0..10..2; do
..
done
无论是 Bash 2/3(C 风格的 for 循环,参见上面的答案)还是 Bash 4,我都更喜欢 'seq' 命令。
【讨论】:
顺便说一句,你知道 bash4 是否是任何主要操作系统的默认设置吗? Bash4 仍然不是主流,不。为什么不序列?好吧,让我们用 IRC 频道 #bash 中的机器人的话来说:“seq(1) 是一个非常不标准的外部命令,用于在愚蠢的 Linux howtos 中计数到 10。” 我的理解是seq是coreutils的一部分。它有什么不标准的?论据?感谢您的帮助。 这些参数可能对你有用,也可能不计算: * 有足够多的系统没有 GNU coreutils(但安装了 Bash) * 你创建了一个不需要的外部进程 * 你依赖于所有 'seq' 的想法你的 'seq' 做了什么 * 它没有被 ISO 标准化 @becko 如果步骤存储在变量i
中,那么你不能做for 0..10..$i
.. 它失败了。【参考方案3】:
纯 Bash,没有额外的过程:
for (( COUNTER=0; COUNTER<=10; COUNTER+=2 )); do
echo $COUNTER
done
【讨论】:
+1 因为step也可以用变量代替。 我认为这确实是大多数人可能想要的——一种使用规定步长值进行循环的简单方法。这听起来比所有基于 seq 的答案都简单,并且比 Bash4 大括号扩展更清晰的语法,并且看起来它允许变量(我没有尝试过,但语法肯定暗示了这一点)。 在 Bash 3 中工作,与 @TheBonsai 的回答不同。 它甚至可以解析变量 ((i="$first" ; i 这有时比0..10..2
-style 快得多,例如当范围真的很大时。【参考方案4】:
#!/bin/bash
for i in $(seq 1 2 10)
do
echo "skip by 2 value $i"
done
【讨论】:
seq 是一个 Linux 命令。这在 Mac OS X 或 FreeBSD 上不可用。 FWIW seq 在我的标准 OS X Mavericks 10.9.1 中可用 我已经尝试了一些其他的sintax,但这是唯一适用于我的小CentOS的。 @z - 拯救了我的一天:D【参考方案5】:$ 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
【讨论】:
【参考方案6】:大括号扩展 m..n..s 比 seq 更有效。 并且它允许一些输出格式:
$ echo 0000..0010..2
0000 0002 0004 0006 0008 0010
如果有一个数字,这很有用,例如文件并希望是 'ls' 的排序输出。
【讨论】:
以上是关于如何在 bash 中生成步骤 n 的范围? (生成带增量的数字序列)的主要内容,如果未能解决你的问题,请参考以下文章