首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在shell中使用jq变量

如何在shell中使用jq变量
EN

Stack Overflow用户
提问于 2021-09-14 14:22:33
回答 2查看 178关注 0票数 0

我正面临以下命令的问题。我需要使用变量,但是它返回null,而当我硬编码它的值时,它会返回正确的响应。有人能帮我写这个命令的正确方式吗?我的意思是把相应键的值作为变量传递?

代码语言:javascript
复制
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
echo $temp1 | jq -r '.SSM_DEV_SECRET_KEY'  <----- return Smkfnkhnb48dh // output
echo $temp1 | jq -r '."$var_name"'  <---- return null
echo $temp1 | jq -r --arg var_name "$var_name" '."$var_name"'  <---- return null , alternative way

更新:我正在添加的实际部分,我试图使用上述修复。我的意思是先读所有以SSM_DEV_开头的值.然后从aws获得原始值,而不是替换它。一对密钥看起来像这样--> SECRET_KEY=$SSM_DEV_SECRET_KEY

代码语言:javascript
复制
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

固定:我已经解决了我的问题,这是关于马车退货的。下面的cmd帮助我:

代码语言:javascript
复制
var_name=`echo ${after:1} | tr -d '\r'`
jq -r --arg var_name "$var_name" '.[$var_name]' <<< "$result1"
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-09-14 14:27:06

您需要使用通用对象索引 (.[$var_name])来让jq知道变量应该被看作是一个键

该命令应该如下所示:

代码语言:javascript
复制
jq -r --arg var_name "$var_name" '.[$var_name]' <<< "$temp1"

将输出:

代码语言:javascript
复制
Smkfnkhnb48dh

注意:<<< "$temp1"而不是echo

票数 2
EN

Stack Overflow用户

发布于 2021-09-14 14:42:38

让我们看一看以下语句:

代码语言:javascript
复制
echo $temp1 | jq -r '."$var_name"'  <---- return null

您的问题实际上是shell引用而不是jq。单引号告诉shell不要插值(做变量替换)和其他事情(比如转义空格和防止全局)。因此,jq从字面上收到了."$var_name“作为脚本--这不是您想要的。您只需删除单引号就可以了:

代码语言:javascript
复制
echo $temp1 | jq -r ."$var_name"  <---- Does this work?

话虽如此,我绝不会那样写我的剧本。我绝对想包括“。”在下面引用的字符串中:

代码语言:javascript
复制
echo $temp1 | jq -r ".$var_name"  <---- Does this work?

有些人还建议您也引用"$temp1“(通常应该引用所有变量引用,以防止空白,但这并不是echo的问题):

代码语言:javascript
复制
echo "$temp1" | jq -r ".$var_name"  <---- Does this work?
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69179552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档