1

我对 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

4 回答 4

5

直接的方法是

#!/bin/bash  

for i in {x1,x2,x3}.jpg {y1,y2}.png; do
  echo $i  
done
于 2012-10-09T15:24:30.213 回答
3

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

于 2012-10-09T15:19:38.973 回答
1

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

PICS=$(echo {x1,x2,x3}.jpg {y1,y2}.png)
于 2012-10-09T15:21:49.890 回答
0

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

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

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

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

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

您还需要引用您的扩展。

于 2012-10-09T15:44:14.230 回答