You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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分支。

解决方法

有两种常用的修复方式:

  1. 让jq输出原始字符串(推荐)
    使用jq的-r(raw output)参数,它会移除字符串结果的双引号,直接输出原始内容:

    # 替换原有jq命令,同时建议用$()替代反引号,可读性更好
    RESPONSE=$(jq -r '.errorCode' /data/logs/errorLog.log)
    

    修改后,RESPONSE的值就是INVALID_API_CREDENTIALS,和判断条件匹配,会正确进入then分支。

  2. 修改判断条件匹配带引号的字符串
    如果不想改动jq命令,可以把判断条件里的字符串加上双引号(注意转义或者用单引号包裹):

    # 方式1:转义双引号
    if [[ "$RESPONSE" = "\"INVALID_API_CREDENTIALS\"" ]]
    # 方式2:用单引号包裹目标字符串
    if [[ "$RESPONSE" = '"INVALID_API_CREDENTIALS"' ]]
    

内容的提问来源于stack exchange,提问作者Ganesh Shinde

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 01:10:15