如何在Bash中通过jq传递变量获取JSON对应键的值?
解决Bash脚本中遍历JSON键值对的问题
问题根源
你原来的写法里,jq会把.[]里的key当成字面量字符串,而非引用Bash变量$key,因此无法正确获取对应值。以下是几种可行解决方案:
方案1:用jq的--arg传递变量(推荐,安全可靠)
通过--arg参数将Bash变量传递给jq,避免字符串拼接的潜在问题:
keys=$(echo "$tags" | jq -r 'keys[]') for key in $keys; do # 用--arg把Bash的$key传给jq的$k变量 value=$(echo "$tags" | jq -r --arg k "$key" '.[$k]') echo "$key has value $value" done
方案2:字符串拼接引用键(仅适用于无特殊字符的键)
如果JSON键不含引号、空格等特殊字符,可直接通过字符串拼接让jq识别变量:
keys=$(echo "$tags" | jq -r 'keys[]') for key in $keys; do value=$(echo "$tags" | jq -r ".\"$key\"") echo "$key has value $value" done
方案3:一次性输出键值对(更高效,减少jq调用)
用jq的to_entries将JSON转为键值对数组,一次性输出后在Bash中处理,避免多次调用jq:
# 用制表符分隔键和值,兼容值含空格的场景 echo "$tags" | jq -r 'to_entries[] | "\(.key)\t\(.value)"' | while IFS=$'\t' read -r key value; do echo "$key has value $value" done
内容的提问来源于stack exchange,提问作者Tinku
相关产品推荐
相关产品推荐

