对 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"
我正在尝试传递引用的通配符模式以使用变量在脚本中查找命令。没有评估就无法工作。这是一种无需评估即可执行此操作的方法吗?
首先我使用以下命令:
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"