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

UNIX环境下Shell脚本Case条件分支报command not found错误求助

错误原因

你的脚本触发command not found的核心问题是if条件判断语法错误:
shell中字符串比较必须放在测试括号[ ] 或 [[ ]]内,你直接写if "$OPTARG" != ""时,shell会把$OPTARG的取值当作系统命令尝试执行,自然触发命令不存在的报错。

除此之外脚本还有多处语法问题,整理如下:

  • 所有if判断语句都缺少测试括号,包括末尾判断exeFlag的逻辑
  • n参数分支的$OPTARG未加双引号,参数带空格时会触发语法错误
  • 自定义函数Full_Check中,调用变量存储的命令时需要加$前缀,否则只会把变量名当普通文本处理
  • 函数内cmd_runctrl的-d {bed}漏写$符号,无法正确读取bed变量值
  • 函数内打印命令变量时也缺$前缀,无法输出实际命令内容

修正后的完整代码

#!/bin/bash
#################### functions #####################
export HADOOP_CLIENT_OPTS="$HADOOP_CLIENT_OPTS -Djline.terminal=jline.UnsupportedTerminal"
startTime=$(date +'%Y-%m-%d %H:%M:%S')
exeFlag="True"

function Full_Check(){
    cmd_meta="./metadata_check.sh -v ${hive_name} -c read_from_file -l ${path} -f ${file}"
    cmd_content="./Content_Compare.sh -t read_file -c ../configs -f ${file} -r ${rev} -l ${path} -d ${bed} -e 1 -h ${head}"
    # 修复漏写的$符号
    cmd_runctrl="./run_control_test.sh -v ${hive_name} -c extract_from_hdfs -l  ${path} -f ${file} -r ${rev} -d ${bed}"

    ##Execute the commands:
    # 修复变量打印缺$的问题
    echo "$cmd_meta" >> "${path}/${hive_name}.full_meta.log"
    # 修复命令调用缺$的问题
    $cmd_meta >> "${path}/${hive_name}.full_meta.log"

    echo "$cmd_content" >> "${path}/${hive_name}.full_content.log"
    $cmd_content >> "${path}/${hive_name}.full_content.log"

    echo "$cmd_runctrl" >> "${path}/${hive_name}.full_RunControl.log"
    $cmd_runctrl >> "${path}/${hive_name}.full_RunControl.log"
}

echo "Execution Flag is : ${exeFlag}"
while getopts ":f:l:d:r:h:o:n:" opt; do
echo "${opt}"
case "${opt}" in
    f)
        # 增加测试括号
        if [ "$OPTARG" != "" ]
        then
            echo "$OPTARG"
            file="$OPTARG"
        else
            echo "Failed : $OPTARG"
            exeFlag="False"
        fi
        ;;
    l)
        if [ "$OPTARG" != "" ]
         then
            echo $OPTARG
            path="$OPTARG"
        else
            exeFlag="False"
        fi
        ;;
    d)
        if [ "$OPTARG" != "" ]
        then
            echo $OPTARG
            bed="$OPTARG"
        else
            exeFlag="False"
        fi
        ;;
    r)
        if [ "$OPTARG" != "" ]
        then
            echo $OPTARG
            rev="$OPTARG"
        else
            exeFlag="False"
        fi
        ;;
    h)
        if [ "$OPTARG" != "" ]
        then
            echo $OPTARG
            head="$OPTARG"
        else
            exeFlag="False"
        fi
        ;;
    o)
        opts="$OPTARG"
        ;;
    n)
        # 增加测试括号和双引号
        if [ "$OPTARG" != "" ]
         then
            echo "$OPTARG"
            hive_name="$OPTARG"
        else
            exeFlag="False"
        fi
        ;;
    *)
            echo "Invalid Tags"
        ;;
esac
done
echo "Execution Flag is : ${exeFlag}"
# 增加测试括号
if [ "${exeFlag}" != "False" ]
then
    Full_Check
else
    echo "Please check the format of the command #./Filecheck.sh -f <file> -l <path> -d <bed> -r <rev> -h <head> -n <hive_name> -o <others>#"
fi
endTime=$(date +'%Y-%m-%d %H:%M:%S')
echo "start time ${startTime}"
echo "end time ${endTime}"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 01:48:03