web-dev-qa-db-ja.com

JSONを環境変数にエクスポートする

このようなJSONがある場合、

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

そして、これらのキーと値のペアのそれぞれを環境変数としてエクスポートしたいのですが、シェルスクリプト経由でそれを行う方法は?たとえば、端末に書き込むとき、echo $hello1world1を印刷する必要があります。他のキーと値のペアについても同様です。注:上記のJSONは、ファイルではなく$valuesという変数に存在します。

jqを介して実行され、このためのシェルスクリプトが記述されることは知っていますが、動作しません。

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

編集:ターンの答えを試して、私はこれをしました:

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
10
Qirohchan

この回答 から借りて、JSONをkey = valueペアに変換するという大変な作業をすべて行います。これらをjq出力とexportinging:

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

コマンド置換$()の使用:

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

編集:this コメントへの応答

やったほうがいい

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

$valuesを囲むdouble引用符に注意してください

注:このアプローチにセキュリティの影響があるかどうか、つまりユーザーがjsonを操作して大混乱を引き起こすことができるかどうかを確認できませんでした。

2
sjsam

次のシェルスクリプトで示すアプローチは、特殊文字に関するほとんどの(ただしすべてではない)問題を回避します。

#!/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"

上記では、キー自体にタブがないことを前提としていることに注意してください。

1
peak

これを実現するために、軽量で柔軟なコマンドラインJSONプロセッサであるjqを使用できます。

次のようにenvironment.jsonというファイルに環境変数があるとします。

# environment.json
{
    "hello1": "world1",
    "testk": "testv"
}

次のスクリプトを使用してそれらをエクスポートできます。

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

次のいずれかを使用して、変数が緩和されていることを確認できます。

printenv

または

echo $VARIABLE_NAME # use the name of your environment variables instead
0
lmiguelvargasf