将Linux命令作为命令行参数传入Shell脚本执行失败求助
问题解决:Shell脚本中执行存储在变量里的find命令失败
问题根源
- 原始命令的语法错误:你给出的
find命令中,-exec参数后的;没有转义或加引号。在Shell中,;是命令分隔符,会被Shell优先解析,导致find认为-exec缺少必要参数。 - 变量存储完整命令的解析问题:将整个命令作为单个字符串存入变量后,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
相关产品推荐
相关产品推荐

