如果我有这样的JSON,
{
"hello1": "world1",
"testk": "testv"
}
我想将这些键值对中的每一个导出为环境变量,如何通过shell脚本来实现?例如,当我在终端上写字时,echo $hello1
,world1
应该打印,其他键值对也是如此?
注意:上面的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
答案 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
说明:
:
替换为 =
,并删除尾随的 ,
。 "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
来造成严重破坏。