基于CURL的Bash脚本逻辑异常:状态为true时else分支不执行
问题排查与优化方案
错误原因分析
你的脚本逻辑本身无语法错误,但实际执行时else分支不触发,核心原因是curl捕获的响应内容并非纯true字符串,大概率存在以下情况:
- 接口返回的
true末尾带有换行符、空格等空白字符 - 接口返回JSON格式的
"true"(被双引号包裹)
这些额外字符会导致[[ $code != true ]]始终成立,无法进入else分支。
修复与优化方案
方案1:清理响应中的空白字符
通过tr命令移除响应里的换行、回车、空格等空白,确保变量仅保留纯内容:
#!/bin/bash code=$(curl -sX GET "http://10.243.215.143:8088/healthcheck" | tr -d '\n\r ') if [[ $code != true ]]; then echo "restart service" else echo "service is up" fi
方案2:兼容带引号的响应
如果接口返回的是带双引号的"true",可以用通配符匹配或精准判断:
#!/bin/bash code=$(curl -sX GET "http://10.243.215.143:8088/healthcheck") # 通配符匹配,兼容带引号或空白的情况 if [[ $code != *true* ]]; then echo "restart service" else echo "service is up" fi
方案3:增加curl请求有效性检查
更严谨的逻辑是先判断curl请求是否成功(比如网络故障、接口宕机),再校验响应内容:
#!/bin/bash # 同时捕获响应内容和HTTP状态码 response=$(curl -s -w "%{http_code}" -X GET "http://10.243.215.143:8088/healthcheck") http_code=${response: -3} content=${response%???} # 请求失败 或 响应内容不含true时重启服务 if [[ $http_code -ne 200 || $content != *true* ]]; then echo "restart service" else echo "service is up" fi
调试技巧
可以先打印变量的实际内容和长度,直观排查问题:
code=$(curl -sX GET "http://10.243.215.143:8088/healthcheck") echo "原始内容: '$code'" echo "内容长度: ${#code}"
内容的提问来源于stack exchange,提问作者Dityudha
相关产品推荐
相关产品推荐

