我对 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 的大括号扩展有一个简单的问题:
#!/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
我该怎么办?
直接的方法是
#!/bin/bash
for i in {x1,x2,x3}.jpg {y1,y2}.png; do
echo $i
done
解析行时执行大括号扩展,不会发生在引号内。
评估命令时,对参数执行大括号和通配符扩展。将第一行更改为:
PICS=$(echo {x1,x2,x3}.jpg {y1,y2}.png)
这些是已经存在的文件吗?如果是,你可能想要一个(ext)glob。例如
printf '%s\n' [xy]+([[:digit:]]).@(jp|pn)g
Bash 中的大括号扩展是第一个扩展步骤。它主要出现在未引用的上下文中,尽管确切的规则很复杂。除非您稍后评估结果,否则您不能将一个存储在字符串中。
printf '%s\n' {x{1..3}.jp,y{1,2}.pn}g
这些可以根据你的感觉来定义。请参阅其他答案以获得较少混淆的选项。
您还需要引用您的扩展。