Shell脚本IF语句判断异常及autorep输出格式问题求助
问题分析与修复
核心问题点
- 输出换行丢失:执行
echo $output时未给变量加双引号,Bash会将变量内的换行符、制表符等空白符统一替换为空格,导致所有值挤在一行。 - IF判断逻辑错误:
$output包含多个作业类型值(每行一个),直接用[ $output == "CMD" ]判断时,是将整个变量的所有内容(比如CMD CMD BOX)和单一字符串比较,永远不会匹配成功。
修复方案
1. 解决换行丢失问题
修改输出语句,给变量加上双引号,即可保留原始换行:
#!/bin/bash read -r i output=$(autorep -j "$i" -q | awk '/^insert_job:/ {printf "%s\n", $4}') echo "$output"
2. 修复IF判断逻辑
根据需求分两种场景提供脚本:
场景A:检查所有匹配的作业是否都是CMD/BOX
遍历每个作业类型,只要有一个不符合就判定为"非命令/盒子作业":
#!/bin/bash read -r i # 捕获所有作业类型,保留换行 output=$(autorep -j "$i" -q | awk '/^insert_job:/ {print $4}') # 初始化标记为有效 all_valid=true # 逐行读取作业类型 while IFS= read -r job_type; do # 检查当前类型是否为CMD或BOX if [[ "$job_type" != "CMD" && "$job_type" != "BOX" ]]; then all_valid=false break # 发现不符合的,直接终止循环 fi done <<< "$output" # 根据标记输出结果 if $all_valid; then echo "所有匹配的作业都是命令或盒子作业" else echo "存在非命令/非盒子作业" fi
场景B:只要有一个作业是CMD/BOX就输出提示
无需捕获所有结果,直接在awk中判断并返回状态码,简化逻辑:
#!/bin/bash read -r i # 用awk直接检查,找到CMD/BOX就返回成功状态(0),否则返回失败(1) if autorep -j "$i" -q | awk '/^insert_job:/ { if ($4 == "CMD" || $4 == "BOX") exit 0 } END {exit 1}'; then echo "存在命令或盒子作业" else echo "没有命令或盒子作业" fi
额外优化建议
- 给变量
i加上双引号:autorep -j "$i" -q,避免当输入包含空格或特殊字符时出现命令执行错误。 - Bash中优先使用
[[ ... ]]替代[ ... ],它支持更丰富的条件语法,且能避免很多因空格导致的语法问题。
内容的提问来源于stack exchange,提问作者NecroCoder
相关产品推荐
相关产品推荐

