Shell脚本IF条件字符串相等判断失效:函数返回值无法匹配
Bash脚本字符串匹配失效问题排查与解决
问题场景
现有两个脚本文件:
- check_ongoing_deployment.sh
#!/usr/bin/env bash check_ongoing_deployment() { deploy_status=$(get_deploy_state "node-server") echo "${deploy_status}" }
- main.sh
source "$(dirname "$0")/check_ongoing_deployment.sh" deployment_status=$(check_ongoing_deployment) echo "Deployment status: $deployment_status" if [[ ${deployment_status} == "PRIMARY" ]]; then echo "No deployment in progress for ${service_to_wait}." else echo "Deployment on going for ${service_to_wait}. Waiting for deployment to complete." fi
执行时echo明确显示deployment_status的值为PRIMARY,但if条件始终进入分支;仅当让check_ongoing_deployment函数直接返回字符串"PRIMARY"时,条件判断才正常生效。尝试去除回车符的操作也未解决问题。
核心原因
问题出在get_deploy_state命令的返回值上——它返回的内容包含肉眼不可见的多余字符(比如首尾空格、换行符\n、制表符\t,或其他非打印ASCII控制字符)。echo输出时会自动忽略这类字符,导致肉眼看起来字符串一致,但实际字节层面并不匹配,最终引发条件判断失效。
排查方法
先通过以下命令确认变量中是否存在多余字符:
deployment_status=$(check_ongoing_deployment) # 打印变量的十六进制形式,查看是否有额外字节 echo -n "$deployment_status" | xxd # 对比字符长度:"PRIMARY"标准长度为7 echo -n "$deployment_status" | wc -c
如果输出的长度大于7,即可确认存在多余字符。
解决方案
方法1:去除首尾所有空白字符(最通用)
在main.sh中修改变量赋值语句,用sed过滤首尾的空白类字符:
deployment_status=$(check_ongoing_deployment | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')
或者用awk更简洁地实现:
deployment_status=$(check_ongoing_deployment | awk '{$1=$1;print}')
方法2:修改函数输出逻辑
直接在check_ongoing_deployment.sh中处理返回值,确保输出纯净字符串:
check_ongoing_deployment() { get_deploy_state "node-server" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' }
方法3:针对性处理特定字符(如果已明确多余字符类型)
比如确认只有末尾换行符时,用tr删除:
deployment_status=$(check_ongoing_deployment | tr -d '\n')
验证
修改后再次用xxd或wc -c确认变量长度为7,此时if条件即可正常匹配。
内容的提问来源于stack exchange,提问作者madu
相关产品推荐
相关产品推荐

