programing

환경 변수로 JSON 내보내기

testmans 2023. 2. 24. 13:20
반응형

환경 변수로 JSON 내보내기

이런 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

JSON을 key=value pair로 변환하는 모든 힘든 작업을 수행하는 이 답변에서 차용하면 이러한 작업을 환경에 적용할 수 있습니다.jq출력 및export입력:

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

로드되는 변수에 공백이 포함되어 있는 경우, 조금 더 복잡한 경우에는 이 방법도 합리적입니다.

while read -rd $'' line
do
    export "$line"
done < <(jq -r <<<"$values" \
         'to_entries|map("\(.key)=\(.value)\u0000")[]')

명령어 대체 사용$():

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

편집 : 이 코멘트에 응답합니다.

해야 한다

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

주의해 주세요double주위의 따옴표$values

주의: 이 접근법에 보안상의 영향이 있는지 여부를 확인할 수 없습니다.즉, 사용자가 이 접근 방식을 조작할 수 있는지 여부를 확인할 수 없습니다.json대혼란을 야기하다.

jq를 사용하지 않는 다른 방법은 grep & sed를 사용하여 json을 해석하는 것입니다.

for keyval in $(grep -E '": [^\{]' my.json | sed -e 's/: /=/' -e "s/\(\,\)$//"); do
    echo "export $keyval"
    eval export $keyval
done

설명:

  • 먼저 grep는 모든 "key" : 쌍을 필터링합니다(값은 "string", "number" 또는 "boolean"일 수 있습니다).
  • 그런 다음 sed가 로 대체되고 후행 부분이 삭제됩니다.
  • 마지막으로 내보내기"key"=value평가하여

다음은 AWS 레코드 세트에서 json 키를 내보내는 출력 예입니다.

"Name"="\052.apps.nmanos-cluster-a.devcluster.openshift.com을 내보냅니다.

내보내기 "Type"="A"

"HostedZoneId"="Z67SXBLZRQ7X7 내보내기T"

"DNSName"="a24070461d50270e-1391692.us-east-1.elb.amazonaws.com"을 내보냅니다.

내보내기 "EvaluateTargetHealth"=false

기존 응답 중 POSIX 쉘 값에는 공백이 유지되지 않습니다.다음 행은 다음과 같습니다.jq일부 JSON의 각 키:값을 가져와 환경 변수로 내보내려면 공백 및 특수 문자를 적절히 이스케이프해야 합니다.

2023-01-28: BUGFIX 업데이트:

이전 답변은 가능한 모든 값에 대해 작동하지 않아 오류가 발생할 수 있습니다.대신 jq를 사용하는 다음 행을 사용하십시오.@sh형식을 지정하여 셸 값을 올바르게 이스케이프합니다.또한 다음 날짜 이후에 모든 것을 동봉해야 합니다.eval따옴표로 묶어서 새 줄을 보존합니다.테스트에 사용할 문자를 추가하도록 샘플 JSON 파일을 업데이트했습니다.

이제 이 답변이 모든 사례를 처리하는 유일한 답변인 것 같습니다.루프는 없으며 모든 값을 내보내는 한 줄입니다.으로는 '먹다'를 입니다.eval이론적으로 위험한...그러나 이제 셸에 대해 key=값 전체가 이스케이프되므로 이 값을 사용해도 안전합니다.

새 답변(이 답변 사용):

eval "export $(echo "$values" \
  | jq -r 'to_entries | map("\(.key)=\(.value)") | @sh')"

오래된 답변(이 답변은 사용하지 않음):

eval export $(echo "$values" \
  | jq -r 'to_entries|map("\"\(.key)=\(.value|tostring)\"")|.[]' )

누락된 '내보내기'를 지적해 주셔서 감사합니다@Delthas 편집

샘플 JSON 파일:

bash-5.2$ cat <<'EOJSON' > foo.json
{
 "foo_1": "bar 1",
 "foo_2": "This ! is ' some @ weird $text { to ( escape \" here",
 "foo_3": "this is some \nsample new line\n    text to\ntry and escape"
}
EOJSON

샘플 스크립트:

bash-5.2$ cat <<'EOSH' > foo.sh
values="`cat foo.json`"
eval "export $(echo "$values" | jq -r 'to_entries | map("\(.key)=\(.value)") | @sh')"
export
echo "foo_2: $foo_2"
echo "foo_3: $foo_3"
EOSH

샘플 스크립트 실행:

bash-5.2$ env -i sh foo.sh
export PWD='/path/to/my/home'
export SHLVL='1'
export foo_1='bar 1'
export foo_2='This ! is '"'"' some @ weird $text { to ( escape " here'
export foo_3='this is some 
sample new line
    text to
try and escape'
foo_2: This ! is ' some @ weird $text { to ( escape " here
foo_3: this is some 
sample new line
    text to
try and escape

장점:

  • 배쉬할 필요 없다
  • 값의 공백을 보존하다
  • 루프 없음
  • (갱신) 셸에서 사용하기 위해 모든 값을 적절히 이스케이프합니다.

단점:

  • eval('어느 쪽인가') 「」, 「」이 있기 때문에,jq는 모든 때문에 문제는 하지 않을 (「」가 아닌 한).jq@sh 필터)를 사용해도 데이터가 올바르게 이스케이프되지 않는 버그가 발견되었습니다.

다음 셸 스크립트에 의해 설명되는 접근방식은 특수문자에 관한 대부분의 문제(전부는 아니지만)를 회피합니다.

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

상기에서는 키 자체에 탭이 없는 것을 전제로 하고 있습니다.

jtc 솔루션:

export $(<file.json jtc -w'[:]<>a:<L>k' -qqT'"{L}={}"')

해결책을 생각해 냈습니다(여기 bash).

function source_json_as_environ() {
  eval "$(jq -r '
  def replace_dot:
    . | gsub("\\."; "_");
  def trim_spaces:
    . | gsub("^[ \t]+|[ \t]+$"; "");
  to_entries|map(
    "export \(.key|trim_spaces|replace_dot)="
    + "\(.value|tostring|trim_spaces|@sh)"
    )|.[]' $@)"
}

다음과 같이 사용할 수 있습니다.

$ source_json_as_environ values.json

언급URL : https://stackoverflow.com/questions/48512914/exporting-json-to-environment-variables

반응형