Bash seq 在 for 循环中产生两个独立的数字序列

Bash seq to produce two separate sequences of numbers in a for loop

我想创建一个简单的 for bash 循环,以特定间隔迭代一系列数字,然后迭代不同的数字序列,例如

for i in $(seq 0 5 15)
do
    echo $i
done

但是在遍历 i=0、5、10、15 之后,我希望它也遍历 30、35、40、45。

有没有办法使用 seq 来做到这一点?或者其他选择?

方法一

只需在 $(...) 中增加命令,再调用 seq:

for i in $(seq 0 5 15; seq 30 5 45); do
    echo $i
done

然后

$ bash test.sh
0
5
10
15
30
35
40
45

# 方法 2

在你的后续评论中,你写

The actual content of the for loop is more than just echo$i (about 200 lines) I don't want to repeat it and make my script huge!

作为上述方法的替代方法,您可以为这 200 行定义一个 shell 函数,然后在一系列 for 循环中调用该函数:

f() {
   # 200 lines
   echo $i
}

for i in $(seq 0 5 15) do
    f
done

for i in $(seq 30 5 45) do
    f
done

方法 3(POSIX 兼容)

为了在 shell 之间实现最大的可移植性,您应该使脚本符合 POSIX。在这种情况下,您需要避开 seq,因为尽管许多发行版都提供了该实用程序,但它并未由 POSIX.

定义

由于您不能使用 seq 生成要迭代的整数序列,并且因为 POSIX 没有定义数字,C 风格的 for 循环,所以您必须求助于 while 循环。为避免重复与该循环相关的代码,您可以定义另一个函数(下面称为 custom_for_loop):

custom_for_loop () {
  # : initial value
  # : increment
  # : upper bound
  # : name of a function that takes one parameter
  local i=
  while [ $i -le  ]; do
       $i
      i=$((i+))
  done
}

f () {
    printf "%s\n" ""
}

custom_for_loop 0 5 15 f
custom_for_loop 30 5 45 f