次のjsonテンプレートファイルがあります。
# INPUT file.json
{
"set1":{
"string1": "${VAR1}",
"string2": "${VAR2}",
(...)
}
}
スクリプトはこれらのVAR値を収集します。したがって、このjsonテンプレートをインポートして、すべての変数が設定されたjson.tmpを出力する必要があります。
# OUTPUT file.json.tmp
{
"set1":{
"string1": "string1_value",
"string2": "string2_value",
(...)
}
}
ファイルを読み込んでエコーしたいのですが、常にこれらの変数を設定せずにtmpファイルを出力します。
VAR1=$1
VAR2=$2
# (...)
JSON_IN=`cat file.json`
echo $JSON_IN > file.json.tmp
どんなアイデアがありますか?
ありがとう
答え1
実行できる操作は次のとおりですenvsubst
。
変数はenvsubst
分岐プロセスであり、エクスポートされていない変数についてはわからないため、エクスポートする必要があります。
export VAR1=$1
export VAR2=$2
envsubst < file.json > file.json.tmp
json
"
変数に二重引用符()や改行文字などの文字が含まれていると、妥当性が損なわれます。
答え2
envsubst
変数の値が「良い」でJSONエンコードが必要ない場合は、この方法を使用してください。また、変数をエクスポートする必要があります。
しかし、これらの状況は、変数に特別な値が含まれる瞬間に崩壊します。
$ jq . file
{
"set1": {
"string1": "${VAR1}",
"string2": "${VAR2}"
}
}
$ export VAR1='line 1
line 2'
$ export VAR2='"hello"'
$ envsubst <file | jq .
parse error: Invalid string: control characters from U+0000 through U+001F must be escaped at line 4, column 7
${
代わりに、JSONファイルから値の開始と終了を削除し、残りの文字列を使用して内部変数(環境変数をキーと値のペアとして保持するオブジェクト)で値を}
見つけます。$ENV
$ jq '.[][] |= ( ltrimstr("${") | rtrimstr("}") | $ENV[.] )' file
{
"set1": {
"string1": "line 1\nline 2",
"string2": "\"hello\""
}
}
この.[][]
値のパスは|=
更新演算子です。したがって、これらの値は、その環境変数の値を見つけてその値に置き換えることによって更新されます。
上記のコードを使用すると、既存の環境変数に対応しない文字列が次に置き換えられますnull
。
$ jq . file
{
"set1": {
"string1": "${VAR1}",
"string2": "${VAR2}",
"string3": "${bumblebee}"
}
}
$ jq '.[][] |= ( ltrimstr("${") | rtrimstr("}") | $ENV[.] )' file
{
"set1": {
"string1": "line 1\nline 2",
"string2": "\"hello\"",
"string3": null
}
}