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
これらは、どのように感じても定義できます。難読化されていないオプションについては、他の回答を参照してください。
また、展開を引用する必要があります。