Bash脚本中jq返回值匹配失败,为何执行else分支?
问题:Bash脚本判断错误分支不生效的原因?
我编写了如下简单Bash脚本:
#!/bin/bash RESPONSE=`jq '.errorCode' /data/logs/errorLog.log` echo $RESPONSE if [[ "$RESPONSE" = "INVALID_API_CREDENTIALS" ]] then echo "Registration unsuccessful..." else echo "Registration successful..." fi
执行该脚本后得到如下输出:
root@ubuntu-test:/data/logs# ./test.sh "INVALID_API_CREDENTIALS" Registration successful... root@gubuntu-test:/data/logs#
明明返回值显示为"INVALID_API_CREDENTIALS",为何脚本执行了else分支?
原因分析与解决方案
核心原因
jq默认输出会给字符串类型的结果加上双引号,你看到的"INVALID_API_CREDENTIALS"是包含双引号的完整字符串,而脚本里的判断条件是和不带双引号的INVALID_API_CREDENTIALS做比较,两者不相等,所以进入了else分支。
解决方法
有两种常用的修复方式:
让jq输出原始字符串(推荐)
使用jq的-r(raw output)参数,它会移除字符串结果的双引号,直接输出原始内容:# 替换原有jq命令,同时建议用$()替代反引号,可读性更好 RESPONSE=$(jq -r '.errorCode' /data/logs/errorLog.log)修改后,
RESPONSE的值就是INVALID_API_CREDENTIALS,和判断条件匹配,会正确进入then分支。修改判断条件匹配带引号的字符串
如果不想改动jq命令,可以把判断条件里的字符串加上双引号(注意转义或者用单引号包裹):# 方式1:转义双引号 if [[ "$RESPONSE" = "\"INVALID_API_CREDENTIALS\"" ]] # 方式2:用单引号包裹目标字符串 if [[ "$RESPONSE" = '"INVALID_API_CREDENTIALS"' ]]
内容的提问来源于stack exchange,提问作者Ganesh Shinde
相关产品推荐
相关产品推荐

