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

将Linux命令作为命令行参数传入Shell脚本执行失败求助

问题解决:Shell脚本中执行存储在变量里的find命令失败

问题根源

  1. 原始命令的语法错误:你给出的find命令中,-exec参数后的;没有转义或加引号。在Shell中,;是命令分隔符,会被Shell优先解析,导致find认为-exec缺少必要参数。
  2. 变量存储完整命令的解析问题:将整个命令作为单个字符串存入变量后,Shell展开变量时会丢失原有的引号语义,正则中的|、-exec后的{}和;会被错误拆分解析,导致命令执行异常。

修复方案

方案1:修正原始命令并使用eval执行(适配你的原调用方式)

首先修正find命令,将;转义为\;或用单引号包裹:

find . -type f -regextype posix-extended -regex './ctrf.*|./rbc.*' -exec basename {} \;

然后修改脚本,用eval重新解析变量中的命令字符串,保留完整的命令结构:

#!/bin/bash
Find_Command="$1"
# 使用eval执行变量中的命令
Files="$(eval "${Find_Command}")"
# 验证结果
echo "$Files"

调用脚本时,将修正后的命令用双引号包裹传入:

./your_script "find . -type f -regextype posix-extended -regex './ctrf.*|./rbc.*' -exec basename {} \;"

⚠️ 注意:eval会执行字符串中的任意Shell命令,仅在你完全信任传入的命令内容时使用,避免传入不可信参数引发安全问题。

方案2:使用数组存储命令参数(更安全的推荐方式)

放弃将整个命令作为单个参数传入,改为拆分每个参数传入脚本,用数组保留参数的边界:

脚本内容:

#!/bin/bash
# 将所有传入的参数存入数组
Find_Command=("$@")
# 执行数组中的命令
Files="$("${Find_Command[@]}")"
# 验证结果
echo "$Files"

调用脚本时,直接传入拆分后的命令参数(注意;用单引号包裹):

./your_script find . -type f -regextype posix-extended -regex './ctrf.*|./rbc.*' -exec basename {} ';'

这种方式能避免Shell对特殊字符的错误解析,是处理命令参数的标准安全做法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 11:20:33