You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Bash中将指定find命令赋值给变量并解决执行报错

问题根源:不是find的锅,是Bash变量展开的问题

你遇到的错误和find命令本身无关,问题出在Bash处理带特殊字符/引号的变量展开方式上:

当你用cmd="find . -name \"*.zip\" -exec echo {} ;"赋值后,直接执行$cmd时,Bash会对变量内容做单词拆分,但此时变量里的引号已经失去了原有的作用——比如\"*.zip\"展开后变成*.zip,如果当前目录有zip文件,shell会直接把它替换成具体的文件名列表;同时-exec后面的{}和;也会被拆分成独立的参数,导致find收到的参数混乱,误把echo当成了路径参数,所以抛出paths must precede expression: echo的错误。

解决方法

推荐下面几种靠谱的处理方式:

1. 用函数封装命令(最安全清晰)

把你的find命令写成一个函数,完全避开变量展开的问题:

find_and_echo_zip() {
    find . -name "*.zip" -exec echo {} \;
}
# 直接执行函数即可
find_and_echo_zip

2. 用数组存储命令参数

把命令的每个部分作为数组的元素,展开时用"${cmd[@]}"能正确保留每个参数的边界:

# 注意这里不需要转义引号,每个参数独立
cmd=(find . -name "*.zip" -exec echo {} \;)
# 执行时用双引号包裹数组展开
"${cmd[@]}"

3. 用eval执行(不推荐,仅自用场景)

如果一定要用字符串变量存储命令,可以用eval强制shell重新解析变量内容的引号和特殊字符,但要注意:如果变量内容来自不可信来源,会有安全风险:

cmd="find . -name \"*.zip\" -exec echo {} \;"
eval "$cmd"

内容的提问来源于stack exchange,提问作者jacobishere

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 19:31:22