在bash中混淆了通配符,变量替换和find命令

时间:2019-01-27 17:43:07

标签: bash find sh quoting string-substitution

我正在尝试传递一个引号括起来的模式以使用变量在脚本中查找命令。没有评估就无法工作。这是一种无需评估的方法吗?

首先,我使用以下命令:

find . -name '*a*'

工作正常,并产生以下输出:

./AaA
./dir1/aaa.tst
./dir1/zabc1122333.tst
./dir2/dir3/zabc1122333.tst
./yyy/AaA
./zabc1122333.tst

现在,我想使用一个变量代替引号形式的' a '。

这不起作用:

A='*a*' ; find . -name $A

它产生:

find: zabc1122333.tst: unknown primary or operator

以下四个命令也不起作用。他们什么也没产生:

A="'*a*'" ; find . -name $A

A=\'\*a\*\' ; find . -name $A

A=\'*a*\' ; find . -name $A

A='\*a\*' ; find . -name $A

最后,它可以与eval一起使用:

A=\'\*a\*\' ; eval find . -name $A

./AaA
./dir1/aaa.tst
./dir1/zabc1122333.tst
./dir2/dir3/zabc1122333.tst
./yyy/AaA
./zabc1122333.tst

是否可以在没有评估的情况下做到?

1 个答案:

答案 0 :(得分:6)

使用引号(")防止bash泛滥。

A='*a*'; find . -name "$A"

查看以下两个命令的输出。

A='*a*'; echo find . -name $A

A='*a*'; echo find . -name "$A"