다음과 같은 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
}
}