1

我想动态构造一个“查找”命令并查看它是否返回任何内容。

这是最小化的例子。在包含文件的目录中,

find . -name '*'

当然返回文件。但

VAR="find . -name '*'"
$VAR

什么都不返回。看起来像是引号解释的问题。但为什么?

(实际情况是我想查看是否存在带有某个前缀的文件。所以我打算使用-name '${MYPREFIX}*',捕获其中的输出$(),并测试生成的字符串是否为空。)

如果这是微不足道的,请道歉。我确实花时间找到了答案,但我发现的所有案例都有些不同。通常,问题是在 find 命令应该执行此操作时扩展通配符的 shell。在这里,shell 没有做任何过早的扩展,但 find 也没有,可能是因为 find 接收文字引号?感谢您的任何见解。

4

2 回答 2

2
eval $VAR

eval会将 的值重新解释为$VAR带有参数的命令。

小心:eval是一种强大但危险的机制。

于 2012-05-09T03:05:20.563 回答
1

我建议eval尽可能不要使用。在这种情况下,如果您确实需要在执行命令之前将命令存储在变量中,我建议使用数组,然后将其调用为"${cmd_array[@]}"

var=(find . -name "${prefix}*")  # This stores the elements of the command as an array
result=$("${var[@]}")  # This executes the command and stores its output in $result

请注意,您还可以动态构造 find 命令:

patterns=()  # start with an empty list of patterns
for prefix in $prefix_list; do
    patterns+=(-o -name "${prefix}*")  # add each prefix to a list of find patterns
done
patterns=("${patterns[@]:1}") # Use array slicing to remove the first "-o"
result=$(find . "${patterns[@]}")

根据您使用它的方式,将 find 命令包装在 bash 函数中也可能会有所帮助:

find_prefix() {
    find . -name "${1}*"
}
result=$(find_prefix "$prefix")
于 2012-05-09T03:52:45.877 回答