对 bash 中的 globbing、变量替换和查找命令的组合感到困惑

Confused by a combination of globbing, variable substitution and find command in bash

我正在尝试传递引用的通配符模式以使用变量在脚本中查找命令。没有评估就无法工作。这是一种无需评估即可执行此操作的方法吗?

首先我使用以下命令:

find . -name '*a*'

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

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

现在我想用一个变量来代替引用的 glob 模式'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

可以不用eval吗?

使用引号 (") 防止 bash 通配。

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

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

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

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