파일 템플릿을 가져오고 설정된 변수를 사용하여 출력합니다.

파일 템플릿을 가져오고 설정된 변수를 사용하여 출력합니다.

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

관련 정보