bash中由globbing,变量替换和find命令组合而混淆

0 bash find sh quoting string-substitution

我试图传递一个引用的globbing模式来使用变量在脚本中查找命令.没有eval就行不通.这是没有eval的方法吗?

首先,我使用followin命令:

find . -name '*a*'
Run Code Online (Sandbox Code Playgroud)

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

./AaA
./dir1/aaa.tst
./dir1/zabc1122333.tst
./dir2/dir3/zabc1122333.tst
./yyy/AaA
./zabc1122333.tst
Run Code Online (Sandbox Code Playgroud)

现在我想用一个变量来代替引用的glob模式' a '.

这不起作用:

A='*a*' ; find . -name $A
Run Code Online (Sandbox Code Playgroud)

它产生:

find: zabc1122333.tst: unknown primary or operator
Run Code Online (Sandbox Code Playgroud)

以下四个命令也不起作用.他们什么都没有:

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

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

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

A='\*a\*' ; find . -name $A
Run Code Online (Sandbox Code Playgroud)

最后它适用于eval:

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

./AaA
./dir1/aaa.tst
./dir1/zabc1122333.tst
./dir2/dir3/zabc1122333.tst
./yyy/AaA
./zabc1122333.tst
Run Code Online (Sandbox Code Playgroud)

没有评估可以做到吗?

Cyr*_*rus 6

使用引号(")来防止bash浮出水面.

A='*a*'; find . -name "$A"
Run Code Online (Sandbox Code Playgroud)

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

A='*a*'; echo find . -name $A
Run Code Online (Sandbox Code Playgroud)

A='*a*'; echo find . -name "$A"
Run Code Online (Sandbox Code Playgroud)