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

