簡體   English   中英

將 JSON 導出到環境變量

[英]Exporting JSON to environment variables

如果我有這樣的 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

借用這個答案,它完成了將 JSON 轉換為鍵=值對的所有艱苦工作,您可以通過循環jq輸出並將它們export到環境中:

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

如果加載的變量包含嵌入的空格,這也是合理的,如果稍微復雜一點:

while read -rd $'' line
do
    export "$line"
done < <(jq -r <<<"$values" \
         'to_entries|map("\(.key)=\(.value)\u0000")[]')

使用命令替換$()

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

編輯:回應評論

你應該做

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

請注意$values周圍的double引號

注意:無法確認這種方法是否存在安全隱患,即用戶是否可以操縱json來造成嚴重破壞。

另一種不使用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" : value對(值可以是"string"numberboolean )。
  • 然后, sed 將替換:= ,並刪除尾隨的,
  • 最后,使用 eval 導出"key"=value

這是一個輸出示例,從 AWS 記錄集中導出 json 密鑰:

導出“名稱”="\\052.apps.nmanos-cluster-a.devcluster.openshift.com。"

導出“類型”=“A”

導出“HostedZoneId”=“Z67SXBLZRQ7X7T”

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

導出“EvaluateTargetHealth”=false

現有答案均未在 POSIX shell 的值中保留空格。為此,請嘗試:

eval $(echo "$values" | jq -r 'to_entries|map("\"\(.key)=\(.value|tostring)\"")|.[]' )

例子:

$ cat <<'EOJSON' > foo.json
{
 "foo_1": "bar 1",
 "foo_2": "bar 2"
}
EOJSON

$ cat <<'EOSH' > foo.sh
values="`cat foo.json`"
eval export $(echo "$values" | jq -r 'to_entries|map("\"\(.key)=\(.value|tostring)\"")|.[]' )
export
echo "foo_2: $foo_2"
EOSH

$ env -i sh foo.sh
export PWD='/home/vagrant'
export foo_1='bar 1'
export foo_2='bar 2'
foo_2: bar 2

優點:

  • 不需要 Bash
  • 在值中保留空格
  • 沒有循環

缺點:

  • 使用eval ,我很確定這不是“安全的”

以下 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"

請注意,以上假設鍵本身沒有選項卡。

jtc解決方案:

export $(<file.json jtc -w'[:]<>a:<L>k' -qqT'"{L}={}"')

我想出了一個解決方案(在 bash 中):

function source_json_as_environ() {
  eval "$(jq -r '
  def replace_dot:
    . | gsub("\\."; "_");
  def trim_spaces:
    . | gsub("^[ \t]+|[ \t]+$"; "");
  to_entries|map(
    "export \(.key|trim_spaces|replace_dot)="
    + "\(.value|tostring|trim_spaces|@sh)"
    )|.[]' $@)"
}

你可以這樣使用它:

$ source_json_as_environ values.json

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM