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

在Shell中如何正确给jq命令传递变量以获取对应JSON键值

jq 使用变量提取JSON键值返回null问题解决

问题现象

我在运行jq命令时遇到变量取值异常问题:硬编码键名可以正常返回对应值,但是通过变量传入键名时返回null,我的核心需求是通过变量动态指定要提取的JSON键名。

错误复现代码

temp1="{    \"SSM_DEV_SECRET_KEY\": \"Smkfnkhnb48dh\",     \"SSM_DEV_GRAPH_DB\": \"Prod=bolt://neo4j:Grt56@atc.preprod.test.com:7687\",  \"SSM_DEV_RDS_DB\": \"sqlite:////var/local/ecosystem_dashboard/config.db\",     \"SSM_DEV_SUPPERUSER_USERNAME\": \"admin\",    \"SSM_DEV_SUPPERUSER_PASSWORD\": \"9dW6JE8@KH9qiO006\"   }"

var_name=SSM_DEV_SECRET_KEY
# 硬编码键名,正常返回 Smkfnkhnb48dh
echo $temp1 | jq -r '.SSM_DEV_SECRET_KEY'
# 直接引用变量,返回null
echo $temp1 | jq -r '."$var_name"'
# 传入参数方式引用变量,仍然返回null
echo $temp1 | jq -r --arg var_name "$var_name" '."$var_name"'

业务场景补充

我需要将该能力应用到如下业务逻辑中:先读取所有以SSM_DEV_...开头的变量引用,再从AWS Secrets Manager获取对应原始值完成替换,单条待替换键值对的格式示例为SECRET_KEY=$SSM_DEV_SECRET_KEY,原始业务代码如下:

temp0="dev"
temp1="DEV"
result1=$(aws secretsmanager get-secret-value --secret-id "xxx-secret-$temp0" | jq '.SecretString')
while IFS= read -r line; do
    if [[ "$line" == *"=\$SSM_$temp1"* ]]; then
        before=${line%%"="*}
        after=${line#*"="}
        var_name="${after:1}"
        jq -r --arg var_name "$var_name" '.[$var_name]' <<< "$result1"
    fi
done < sample_file.txt

问题根源与修复方案

问题根源是读取到的变量值末尾携带了回车符,移除回车符后即可正常运行,修复后代码如下:

# 先移除变量中的回车符
var_name=`echo ${after:1} | tr -d '\r'`
jq -r --arg var_name "$var_name" '.[$var_name]' <<< "$result1"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 16:51:00