환경 변수로 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
'programing' 카테고리의 다른 글
AngularJS를 명시적으로 지원하는 IDE가 있습니까? (0) | 2023.02.24 |
---|---|
CORB(Cross-Origin Read Blocking) (0) | 2023.02.24 |
봄에는 index.html의 모든 루트를 캐치합니다. (0) | 2023.02.24 |
Wordpress는 slug와 함께 분류법 이름을 가져옵니다. (0) | 2023.02.24 |
부정한 C# 식별자의 원인이 되는 JSON 문자열을 해석하려면 어떻게 해야 합니까? (0) | 2023.02.24 |