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
相关产品推荐
相关产品推荐

