【发布时间】:2014-10-24 18:34:38
【问题描述】:
有没有办法可靠地使用存储在变量中的任意通配模式?如果模式同时包含空格和元字符,我会遇到困难。这就是我的意思。如果我将模式存储在没有空格的变量中,那么事情似乎就可以正常工作:
<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 诡计?
【问题讨论】:
-
我不相信你可以在不分词的情况下获得通配符。
-
根本问题是分词发生在路径名扩展(也称为通配符)之前,并且无法更改扩展顺序(这让希望
{1..$n}工作的人非常懊恼) .就像 John1024 的回答一样,您可以禁用分词。 -
如果您事先不知道模式,那么在使用 eval 时要非常小心。你永远不知道Little Bobby Tables 什么时候会出现。 :)
标签: bash glob variable-expansion