有没有办法可靠地使用存储在变量中的任意通配模式?如果模式同时包含空格和元字符,我会遇到困难。这就是我的意思。如果我将模式存储在没有空格的变量中,那么事情似乎就可以正常工作:
<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|
问题是,我正在编写一个事先不知道模式的脚本。有什么方法可以可靠地使 bash 将变量的内容视为通配模式,而不使用某种eval
诡计?