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

如何让jq返回退出状态码而非布尔值以适配grep?

问题描述

我有如下脚本:

grep -e . testFile |
jq -e ".fundingMoved.\"com.test\".map.\"java.util.HashMap\" |

if .TRANSACTION_DESTINATION? then
(.AGREEMENT_OWNING_ORG | startswith(\"MXN\")) and (.TRANSACTION_DESTINATION |startswith(\"BRL\")) or
(.AGREEMENT_OWNING_ORG | startswith(\"MXN\")) and (.TRANSACTION_DESTINATION |startswith(\"CAD\")) or
(.AGREEMENT_OWNING_ORG | startswith(\"MXN\")) and (.TRANSACTION_DESTINATION |startswith(\"USD\"))
else
(.AGREEMENT_OWNING_ORG | startswith(\"USD\")) and (.WAREHOUSE |startswith(\"AUD\")) or
(.AGREEMENT_OWNING_ORG | startswith(\"USD\")) and (.WAREHOUSE |startswith(\"AED\")) or
(.AGREEMENT_OWNING_ORG | startswith(\"USD\")) and (.WAREHOUSE |startswith(\"EGP\"))

end"

当testFile符合条件时jq输出true,不符合时输出false。由于遗留系统仅接受grep作为执行入口,所以我将grep与jq结合使用。但现在的问题是:即使jq输出false,grep仍会返回成功状态码(0)并触发后续操作。我已经尝试了jq的-e选项,但它依然输出true/false字符串,没有将布尔结果转化为退出码来影响grep的返回状态。

我的需求是:当jq中的条件成立时,整个命令返回成功状态码;当jq返回false时,返回非零状态码。请问该如何调整脚本?

解决方案

你可以通过以下两种方法实现需求:

方法一:让jq输出特定标记,用grep匹配标记控制返回码

修改脚本,让jq仅在条件成立时输出一个特定字符串(比如MATCH),否则不输出内容。最后用grep -q静默匹配该字符串,这样grep的返回码就完全由jq的条件结果决定:

grep -e . testFile |
jq -r '
.fundingMoved."com.test".map."java.util.HashMap" |
if .TRANSACTION_DESTINATION? then
  (.AGREEMENT_OWNING_ORG | startswith("MXN")) and (.TRANSACTION_DESTINATION | startswith("BRL")) or
  (.AGREEMENT_OWNING_ORG | startswith("MXN")) and (.TRANSACTION_DESTINATION | startswith("CAD")) or
  (.AGREEMENT_OWNING_ORG | startswith("MXN")) and (.TRANSACTION_DESTINATION | startswith("USD"))
else
  (.AGREEMENT_OWNING_ORG | startswith("USD")) and (.WAREHOUSE | startswith("AUD")) or
  (.AGREEMENT_OWNING_ORG | startswith("USD")) and (.WAREHOUSE | startswith("AED")) or
  (.AGREEMENT_OWNING_ORG | startswith("USD")) and (.WAREHOUSE | startswith("EGP"))
end |
if . then "MATCH" else empty end
' | grep -q "MATCH"

关键改动说明:

  • 添加-r参数让jq输出原始字符串(不带引号)
  • 最后增加if . then "MATCH" else empty end逻辑:仅当条件为true时输出MATCH,否则输出空
  • 末尾用grep -q "MATCH":静默模式下匹配字符串,匹配到返回0(成功),未匹配到返回1(失败)

方法二:启用shell的pipefail选项(若系统允许)

如果你的遗留系统允许修改shell选项,可以开启pipefail,让管道的退出码等于最后一个非零退出码的命令的状态:

set -o pipefail
grep -e . testFile | jq -e '
.fundingMoved."com.test".map."java.util.HashMap" |
if .TRANSACTION_DESTINATION? then
  (.AGREEMENT_OWNING_ORG | startswith("MXN")) and (.TRANSACTION_DESTINATION | startswith("BRL")) or
  (.AGREEMENT_OWNING_ORG | startswith("MXN")) and (.TRANSACTION_DESTINATION | startswith("CAD")) or
  (.AGREEMENT_OWNING_ORG | startswith("MXN")) and (.TRANSACTION_DESTINATION | startswith("USD"))
else
  (.AGREEMENT_OWNING_ORG | startswith("USD")) and (.WAREHOUSE | startswith("AUD")) or
  (.AGREEMENT_OWNING_ORG | startswith("USD")) and (.WAREHOUSE | startswith("AED")) or
  (.AGREEMENT_OWNING_ORG | startswith("USD")) and (.WAREHOUSE | startswith("EGP"))
end
' > /dev/null

关键改动说明:

  • set -o pipefail:让管道的整体退出码等于管道中第一个非零退出码的命令的状态
  • > /dev/null:屏蔽jq的输出,只保留退出码
  • jq的-e选项会根据输出的布尔值设置退出码:输出true时返回0,false时返回1

内容的提问来源于stack exchange,提问作者Jeya Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 07:09:19