変数に格納されている任意のグロビング パターンを確実に使用する方法はありますか? パターンにスペースとメタ文字の両方が含まれている場合、問題が発生します。これが私の言いたいことです。スペースなしで変数に格納されたパターンがある場合、問題なく動作するようです:
<prompt> touch aa.{1,2,3} "a b".{1,2,3}
<prompt> p="aa.?"
<prompt> for f in ${p} ; do echo "|$f|" ; done
|aa.1|
|aa.2|
|aa.3|
<prompt> declare -a A=($p) ; for f in "${A[@]}" ; do echo "|$f|" ; done
|aa.1|
|aa.2|
|aa.3|
ただし、パターンにスペースを入れるとすぐに、事態は受け入れられなくなります。
<prompt> p="a b.?"
<prompt> for f in ${p} ; do echo "|$f|" ; done
|a|
|b.?|
<prompt> declare -a A=($p) ; for f in "${A[@]}" ; do echo "|$f|" ; done
|a|
|b.?|
<prompt> for f in "${p}" ; do echo "|$f|" ; done
|a b.?|
<prompt> for f in $(printf "%q" "$p") ; do echo "|$f|" ; done
|a\|
|b.\?|
明らかに、事前にパターンがわかっている場合は、手動でエスケープできます。
<prompt> for f in a\ b.* ; do echo "|$f|" ; done
|a b.1|
|a b.2|
|a b.3|
問題は、事前にパターンがわからないスクリプトを書いていることです。ある種のeval
策略に頼らずに、bash に変数の内容をグロビング パターンとして確実に扱わせる方法はありますか?