bash';s支架扩展没有';行不通

bash';s支架扩展没有';行不通,bash,brace-expansion,Bash,Brace Expansion,我对bash的brace扩展有一个简单的问题: #!/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.jpgx2.jpgx3.jpgy1.png y2.png 我该怎么办?大括号扩展是在分析行时执行的,不会发生在引号内。大括号扩展是在分析行时执行的,不会发生在引号内。在计算命令

我对bash的brace扩展有一个简单的问题:

#!/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.jpgx2.jpgx3.jpgy1.png y2.png

我该怎么办?

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

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

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

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

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

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

直截了当的方法是

#!/bin/bash  

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

直截了当的方法是

#!/bin/bash  

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

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

printf '%s\n' [xy]+([[:digit:]]).@(jp|pn)g
Bash中的大括号扩展是第一个扩展步骤。它主要发生在无引号的上下文中,尽管确切的规则很复杂。除非稍后对结果求值,否则不能将其存储在字符串中

printf '%s\n' {x{1..3}.jp,y{1,2}.pn}g
这些可以根据你的感觉来定义。请参阅其他答案,以了解较少混淆的选项


您还需要引用扩展名。

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

printf '%s\n' [xy]+([[:digit:]]).@(jp|pn)g
Bash中的大括号扩展是第一个扩展步骤。它主要发生在无引号的上下文中,尽管确切的规则很复杂。除非稍后对结果求值,否则不能将其存储在字符串中

printf '%s\n' {x{1..3}.jp,y{1,2}.pn}g
这些可以根据你的感觉来定义。请参阅其他答案,以了解较少混淆的选项


您还需要引用展开式。

更一般地说,无论是否引用,都不会在作业的右侧执行大括号展开;但是大括号扩展是对数组赋值中的值执行的。更一般地说,大括号扩展不是对赋值的RHS执行的,不管它是否被引用;但是对数组赋值中的值执行大括号扩展。或者
PICS=({x1,x2,x3}.jpg{y1,y2}.png);对于“${PICS[@]}”中的i;做完成
PICS=({x1,x2,x3}.jpg{y1,y2}.png);对于“${PICS[@]}”中的i;做完成