【问题标题】:How to expand an argument with a range in square brackets in a bash script?如何在bash脚本中用方括号中的范围扩展参数?
【发布时间】:2020-10-10 01:37:56
【问题描述】:

我想使用包含数字的字符串作为脚本的输入。这个列表可能相当长,并且可能包含连续的数字范围,所以我考虑做ls 样式列表规范。但是,如何在脚本中扩展此列表? 更具体地说,我想运行:

myscript node-[2,5-7,10-13]

并且能够在我的脚本中循环遍历 node-2、node-5、node-6 等。

更新:似乎我需要在列表中使用大括号和点。我可以将字符串转换为该字符串,但是如何使脚本将其视为列表呢?我能做什么:

nodelist=`echo $1 | sed 's/\[/\{/' | sed 's/\]/\}/' | sed 's/-/../'`

但是对于输入 node[1-3] 例如我得到:

>echo $nodelist
node{1..3}

【问题讨论】:

    标签: bash command-line-arguments square-bracket


    【解决方案1】:

    你的意思是这样的吗?

    $ echo node-{2,{5..7},{10..13}}

    node-2 node-5 node-6 node-7 node-10 node-11 node-12 node-13

    编辑

    您可以重新格式化您的范围以对 bash 友好:

    echo '[2,5-7,10-13]'|sed -e 's:[[](.*)[]]:{\1}:' -e 's:([0- 9]+)[-]([0-9]+):{\1..\2}:g'

    {2,{5..7},{10..13}}

    【讨论】:

    • 这可以工作,但我想用方括号保留输入。我想我可以重新格式化脚本中的输入以符合这一点。我已经更新了我的问题。
    • 编辑了我的 anster 以添加一些如何转换范围的示例。
    • 是的,我想到了,只有您的解决方案看起来好多了,并且处理了第一个破折号。我如何扩展结果?顺便说一句,您的命令给出了 invalid reference \1 on s' command's RHS 错误。
    • 知道了。它需要额外的-r 选项才能使用反向引用。我关于扩大转换范围的问题仍然存在。
    • 也知道了。 eval 完成这项工作:)
    【解决方案2】:

    使用ranges进行大括号扩展

    myscript node-2 node-{5..7} node-{10..13}
    

    您可以将其嵌套以使其更短

    myscript node-{2,{5..7},{10..13}}
    

    【讨论】:

      【解决方案3】:

      如果列表中只有一个项目,即字符串中没有逗号,那么您最终会在开头和结尾使用双花括号,这在 bash 扩展它时会变得有点难看。考虑以下内容,它基本上使用了前面的示例:

      # eval echo $(echo '[2,5-7,10-13]'|sed -r 's:\[(.*)\]:{\1}:;s:([0-9]+)-([0-9]+):{\1..\2}:g')
      2 5 6 7 10 11 12 13
      # eval echo $(echo '[10-13]'|sed -r 's:\[(.*)\]:{\1}:;s:([0-9]+)-([0-9]+):{\1..\2}:g')
      {10} {11} {12} {13}
      

      如果在字符串中没有逗号的情况下去掉前导和尾随花括号,效果会更好:

      # eval echo $(echo '[2,5-7,10-13]'|sed -r 's:\[(.*)\]:{\1}:;s:([0-9]+)-([0-9]+):{\1..\2}:g;s:^\{([^,]*)\}$:\1:')
      2 5 6 7 10 11 12 13
      # eval echo $(echo '[10-13]'|sed -r 's:\[(.*)\]:{\1}:;s:([0-9]+)-([0-9]+):{\1..\2}:g;s:^\{([^,]*)\}$:\1:')
      10 11 12 13
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-01
        • 1970-01-01
        相关资源
        最近更新 更多