Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash命令替换:在单引号中查找带有通配符的命令_Bash_Quotes_Command Substitution - Fatal编程技术网

bash命令替换:在单引号中查找带有通配符的命令

bash命令替换:在单引号中查找带有通配符的命令,bash,quotes,command-substitution,Bash,Quotes,Command Substitution,我想动态构造一个“find”命令,看看它是否返回任何东西 这是一个最小化的例子。在包含文件的目录中 find . -name '*' 当然会返回文件。但是 VAR="find . -name '*'" $VAR 不返回任何内容。看起来像是解释引语的问题。但是为什么呢 (实际情况是,我希望查看是否存在具有特定前缀的文件。因此我打算使用-name'${MYPREFIX}*',捕获$()中的输出,并测试结果字符串是否为空。) 如果这是微不足道的,我道歉。我确实花了时间来寻找答案,但我发现的所有案例

我想动态构造一个“find”命令,看看它是否返回任何东西

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

find . -name '*'
当然会返回文件。但是

VAR="find . -name '*'"
$VAR
不返回任何内容。看起来像是解释引语的问题。但是为什么呢

(实际情况是,我希望查看是否存在具有特定前缀的文件。因此我打算使用
-name'${MYPREFIX}*'
,捕获
$()
中的输出,并测试结果字符串是否为空。)

如果这是微不足道的,我道歉。我确实花了时间来寻找答案,但我发现的所有案例都有所不同。通常,问题是shell在find命令应该执行通配符时扩展了通配符。在这里,shell不会进行任何过早的扩展,但find也不会,可能是因为find接收文字引号?谢谢你的洞察力

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


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

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

请注意,您还可以动态构造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")

echo$VAR
通常是
eval$VAR
的明智先驱:-)我以为我知道
eval
,但没有意识到在
$()
中可能需要它。你的答案和kev的答案都能解决我的问题。非常感谢。“
eval
是危险的”-不,不比任何其他shell脚本更危险单引号用于防止shell扩展通配符,但它们不是
find
命令的一部分,它停止工作的原因是您现在指示
find
只查找名称以单引号开头和结尾的文件
eval
基本上只在这里起作用,但真正的解决方案是修正报价。然而,另见
find_prefix() {
    find . -name "${1}*"
}
result=$(find_prefix "$prefix")