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

为何jq中使用--arg传递变量无法正常展开?bash展开却可行

问题原因与解决方案

核心问题是类型不匹配:

  • 用bash直接展开$ID时,shell会把变量的数值(比如123)直接替换到jq脚本中,此时jq执行的是.id==123——id本身是数值类型,和传入的数值直接比较,匹配逻辑正常。
  • 用--arg传递变量时,--arg默认会把所有值当作字符串类型传递。假设$ID的值是123,jq里实际执行的是.id=="123",数值与字符串比较结果为false,导致stack函数找不到符合条件的节点,自然没有输出。

解决办法

有两种可靠的修复方式:

1. 使用--argjson传递数值类型变量

--argjson会将变量值当作JSON格式解析,若$ID是数值,会直接以数值类型传入jq:

jq -r --argjson ID "$ID" 'include "i3"; stack(.id==$ID) | .[] | select(.type=="workspace") | .name' <<< "$TREE"

2. 在jq中将字符串变量转为数值

如果必须用--arg,可以在jq里用tonumber把$ID转换成数值后再比较:

jq -r --arg ID "$ID" 'include "i3"; stack(.id==($ID | tonumber)) | .[] | select(.type=="workspace") | .name' <<< "$TREE"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 04:55:58