bash的支撑扩展不起作用

时间:2012-10-09 15:18:19

标签: bash brace-expansion

我对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
我该怎么办?

4 个答案:

答案 0 :(得分:5)

直截了当的方式是

#!/bin/bash  

for i in {x1,x2,x3}.jpg {y1,y2}.png; do
  echo $i  
done

答案 1 :(得分:3)

在分析行时执行括号扩展,并且不会在引号内发生。

答案 2 :(得分:1)

在评估命令时,对参数执行括号和通配符扩展。将第一行更改为:

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

答案 3 :(得分:0)

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

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

Bash中的Brace扩展是第一个扩展步骤。它主要发生在不带引号的上下文中,尽管确切的规则很复杂。除非您稍后评估结果,否则不能将其存储在字符串中。

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

无论你觉得如何,都可以定义。有关较少混淆的选项,请参阅其他答案。

您还需要引用您的扩展。