【问题标题】:bash's brace-expansion didn't workbash 的大括号扩展不起作用
【发布时间】:2012-10-09 15:18:19
【问题描述】:

我对 bash 的大括号扩展有一个简单的问题:

#!/bin/bash  
PICS="{x1,x2,x3}.jpg {y1,y2}.png"    
for i in $PICS  
do  
  echo $i  
done

但结果是:
{x1,x2,x3}.jpg
{y1,y2}.png
但我想要的结果是:x1.jpg x2.jpg x3.jpg y1.png y2.png
我该怎么办?

【问题讨论】:

    标签: bash brace-expansion


    【解决方案1】:

    直截了当的方法是

    #!/bin/bash  
    
    for i in {x1,x2,x3}.jpg {y1,y2}.png; do
      echo $i  
    done
    

    【讨论】:

    • PICS=( {x1,x2,x3}.jpg {y1,y2}.png ); for i in "${PICS[@]}"; do ...; done
    【解决方案2】:

    大括号扩展在解析行时执行,不会发生在引号内。

    【讨论】:

    • 更一般地,大括号扩展不会在赋值的 RHS 上执行,无论它是否被引用;但是对数组赋值中的值执行大括号扩展
    【解决方案3】:

    计算命令时对参数执行大括号和通配符扩展。将第一行更改为:

    PICS=$(echo {x1,x2,x3}.jpg {y1,y2}.png)
    

    【讨论】:

      【解决方案4】:

      这些是已经存在的文件吗?如果是,你可能想要一个(ext)glob。例如。

      printf '%s\n' [xy]+([[:digit:]]).@(jp|pn)g
      

      Bash 中的大括号扩展是第一个扩展步骤。它主要出现在未引用的上下文中,尽管确切的规则很复杂。除非稍后对结果进行评估,否则不能将其存储在字符串中。

      printf '%s\n' {x{1..3}.jp,y{1,2}.pn}g
      

      这些可以根据你的感觉来定义。请参阅其他答案以获得较少混淆的选项。

      你还需要引用你的扩展。

      【讨论】:

        猜你喜欢
        • 2012-02-07
        • 1970-01-01
        • 2021-03-07
        • 1970-01-01
        • 1970-01-01
        • 2016-01-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多