命令替换中的bash变量替换

Wei*_* Li 6 bash shell

我想做类似以下的事情:

#!/bin/bash

cmd="find . -name '*.sh'"
echo $($cmd)
Run Code Online (Sandbox Code Playgroud)

我期望它会显示当前目录中的所有shell脚本文件,但什么也没发生.

我知道我可以根据这篇文章解决eval的问题

#!/bin/bash

cmd="find . -name '*.sh'"
eval $cmd
Run Code Online (Sandbox Code Playgroud)

所以我的问题是为什么命令替换在这里不起作用,$(...)和eval在问题方面的区别是什么?

Tom*_*rka 2

命令替换在这里起作用。只是你引用错了。你的脚本只找到一个文件名!这里面有单引号和星号:

'*.sh'
Run Code Online (Sandbox Code Playgroud)

您可以通过此命令创建这样的不常见文件并测试它:

touch "'*.sh'"
Run Code Online (Sandbox Code Playgroud)

bash 中的引用与其他编程语言中的引用不同。查看此答案中的详细信息。

你需要的是这个引用:

cmd="find . -name *.sh"
echo $($cmd)
Run Code Online (Sandbox Code Playgroud)