将JSON导出到环境变量

时间:2018-01-30 02:18:34

标签: json bash shell environment-variables jq

如果我有这样的JSON,

{
    "hello1": "world1",
    "testk": "testv"
}

我想将这些键值对中的每一个导出为环境变量,如何通过shell脚本来实现?例如,当我在终端上写字时,echo $hello1world1应该打印,其他键值对也是如此? 注意:上面的JSON存在于名为$values的变量中,而不是存在于文件中。

我知道它将通过jq完成并为此编写一个shell脚本,但它不起作用。

for row in $(echo "${values}" | jq -r '.[]'); do
    -jq() {
        echo ${row} | jq -r ${1}
    }
    echo $(_jq '.samplekey')
done

编辑:尝试Turn的回答,我这样做了:

values='{"hello1":"world1","hello1.world1.abc1":"hello2.world2.abc2","testk":"testv"}'
for s in $(echo $values | jq -r "to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]" ); do
    export $s
done

5 个答案:

答案 0 :(得分:8)

借用this answer来完成将JSON转换为键值对的所有艰苦工作,您可以通过循环jq输出和export将这些内容放入环境中他们:

for s in $(echo $values | jq -r "to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]" ); do
    export $s
done

答案 1 :(得分:1)

以下shell脚本说明的方法避免了大多数(但不是全部)特殊字符的问题:

#!/bin/bash

function json2keyvalue {
   cat<<EOF | jq -r 'to_entries|map("\(.key)\t\(.value|tostring)")[]'
{
    "hello1": "world1",
    "testk": "testv"
}
EOF
}

while IFS=$'\t' read -r key value
do
    export "$key"="$value"
done < <(json2keyvalue)

echo hello1="$hello1"
echo testk="$testk"

请注意,上面假设密钥本身没有标签。

答案 2 :(得分:1)

不使用jq 的另一种方法是使用 grep&sed 解析json:

for keyval in $(grep -E '": [^\{]' my.json | sed -e 's/: /=/' -e "s/\(\,\)$//"); do
    echo "export $keyval"
    eval export $keyval
done

说明:

  • 首先,grep将过滤所有 “ key”:值 对(值可以是 “ string” number boolean )。
  • 然后,sed将 : 替换为 = ,并删除尾随的 ,
  • 最后,用eval导出"key"=value

这是一个输出示例,从AWS记录集中导出json密钥:

  

导出“名称” =“ \ 052.apps.nmanos-cluster-a.devcluster.openshift.com。”

     

导出“ Type” =“ A”

     

export“ HostedZoneId” =“ Z67SXBLZRQ7X7T”

     

导出“ DNSName” =“ a24070461d50270e-1391692.us-east-1.elb.amazonaws.com。”

     

导出“ EvaluateTargetHealth” = false

答案 3 :(得分:1)

jtc解决方案:

System.out.println(Integer.toHexString(32));

答案 4 :(得分:0)

使用命令替换$()

# $(jq -r 'keys[] as $k | "export \($k)=\(.[$k])"' file.json)
# echo $testk
testv

修改:回复this评论

你应该做

$( echo "$values" | jq -r 'keys[] as $k | "export \($k)=\(.[$k])"' )

请注意double

周围的$values引号

注意:无法确认这种方法是否存在安全隐患,即用户是否可以操纵json来造成严重破坏。