为何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
相关产品推荐
相关产品推荐

