【问题标题】:How to create a nested sequence in bash?如何在 bash 中创建嵌套序列?
【发布时间】:2020-05-05 03:29:04
【问题描述】:

我必须在 bash 脚本中创建一个嵌套序列,例如 a1b1 a1b2 ab3 a2b1 a2b2 a2b3。 两个序列的上限将通过命令行参数获取。

我开始了解seq command,但有了这个我只能创建单个序列。 我使用了这个声明echo $(seq -f "a%g" 8)。 有没有办法使用 seq 命令或任何其他方式创建嵌套序列。 注意:我尝试使用扩展大括号,但它不起作用,因为我必须从命令行参数中获取限制。

【问题讨论】:

    标签: bash seq


    【解决方案1】:
    $for i in $(seq 2); do for j in $(seq 3); do  echo "a${i}b${j}"; done; done;
    a1b1
    a1b2
    a1b3
    a2b1
    a2b2
    a2b3
    $
    

    【讨论】:

      【解决方案2】:

      另一种方法是使用 GNU 并行 (https://www.gnu.org/software/parallel/):

      a=$(seq -f "a%g" 8)
      b=$(seq -f "b%g" 8)
      parallel echo {} ::: $a ::: $b
      

      注意。如果您需要按正确顺序输出,请使用parallel --keep-order echo {} ::: $a ::: $b 或将结果通过管道传送到sort,例如parallel echo {} ::: $a ::: $b | sort

      【讨论】:

      • 如果嵌套序列实际上只是生成参数的一个步骤,每个参数都将由相同的命令运行,这将特别有用。
      • 是的,绝对是,这就是我相信 OP 根据他的评论试图做的事情:“注意:我尝试使用扩展大括号,但它不起作用,因为我必须从命令中获取限制行参数”
      【解决方案3】:

      跟随你的工作。只是你必须实现某种循环机制

      for i in `seq -f "a%g" 2`
      do
         for j in `seq -f "b%g" 3`
         do
            echo $i$j
         done
      done
      

      【讨论】:

        【解决方案4】:

        只需从 bash 进行大括号扩展

        printf '%s\n' a{1..2}b{1..3}
        

        输出

        a1b1
        a1b2
        a1b3
        a2b1
        a2b2
        a2b3
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-01-11
          • 2022-01-16
          • 2011-07-29
          • 1970-01-01
          • 1970-01-01
          • 2019-12-06
          • 1970-01-01
          相关资源
          最近更新 更多