このようなJSONがある場合、
{
"hello1": "world1",
"testk": "testv"
}
そして、これらのキーと値のペアのそれぞれを環境変数としてエクスポートしたいのですが、シェルスクリプト経由でそれを行う方法は?たとえば、端末に書き込むとき、echo $hello1
、world1
を印刷する必要があります。他のキーと値のペアについても同様です。注:上記の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
この回答 から借りて、JSONをkey = valueペアに変換するという大変な作業をすべて行います。これらをjq
出力とexport
inging:
for s in $(echo $values | jq -r "to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]" ); do
export $s
done
コマンド置換$()
の使用:
# $(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
を操作して大混乱を引き起こすことができるかどうかを確認できませんでした。
次のシェルスクリプトで示すアプローチは、特殊文字に関するほとんどの(ただしすべてではない)問題を回避します。
#!/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"
上記では、キー自体にタブがないことを前提としていることに注意してください。
これを実現するために、軽量で柔軟なコマンドライン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