如何在 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 的范围? (生成带增量的数字序列)的主要内容,如果未能解决你的问题,请参考以下文章

在 Netezza 中生成从 1 到 N 的数字范围

在 Julia 中生成范围内的随机整数

在熊猫中生成给定范围内的随机日期

如何在excel中生成一个在一定范围内的随机数

如何仅在 ES2015 中生成从 0 到 n 的数字范围?

在Python中生成颜色范围