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

标签 bash for-loop seq

我想创建一个简单的 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

#方法二

在你的后续评论中,你写

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 () {
  # $1: initial value
  # $2: increment
  # $3: upper bound
  # $4: name of a function that takes one parameter
  local i=$1
  while [ $i -le $3 ]; do
      $4 $i
      i=$((i+$2))
  done
}

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

custom_for_loop 0 5 15 f
custom_for_loop 30 5 45 f

关于Bash seq 在for循环中产生两个独立的数字序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32482421/

相关文章:

bash - 现有的 fd 是否总是被复制为输入和输出?

python - 如何确保 slurm 中的 python 提交脚本位于发出 sbatch 命令的位置?

javascript - "for (… in …)"循环中的元素顺序

类似 scala 比较器的序列函数

r - 获取每个人的每第 n 列的总和,并在 r 中创建新的数据框

Bash排序,我不知道如何对同一行进行排序,并选择较旧的

linux - 使用 cat 在管道之间弹跳角色

python - 用 JSON 中的字符串列表替换单词中的多个相等字符串

c - i ["string"] 如何用作条件语句?

f# - 如何从序列的迭代中提前返回?