【问题标题】:How to produce a range with step n in bash? (generate a sequence of numbers with increments)如何在 bash 中生成步骤 n 的范围? (生成带增量的数字序列)
【发布时间】: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 风格的循环。

标签: bash range iteration


【解决方案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' 的排序输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-30
      • 1970-01-01
      • 1970-01-01
      • 2016-08-25
      相关资源
      最近更新 更多