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