작은 스크립트가 있어요
ABC=100000
DFG=600000
JSON="[{"Address":"$ABC","Backup":false,"name":"$ABC:11011","port":6745,"targetId":"$DFG","weight":1}]"
echo $JSON
내가 얻는 결과는 다음과 같습니다.
[{Address:$ABC,Backup:false,name:$ABC:11011,port:6745,targetId:$DFG,weight:1}]
이 경우 누구든지 저를 도와줄 수 있나요? TIA
답변1
큰따옴표로 묶인 문자열에 큰따옴표가 포함되어 있습니다.
유지하려는 모든 내부 따옴표를 이스케이프할 수 있습니다.
JSON="[{\"Address\":\"$ABC\",\"Backup\":false,\"name\":\"$ABC:11011\",\"port\":6745,\"targetId\":\"$DFG\",\"weight\":1}]"
작은따옴표로 묶은 문자열을 사용하여 변수 위치를 구분할 수 있습니다(읽기 어렵습니다).
JSON='[{"Address":"'"$ABC"'","Backup":false,"name":"'"$ABC"':11011","port":6745,"targetId":"'"$DFG"'","weight":1}]'
작은따옴표로 묶은 형식 문자열과 함께 printf를 사용할 수 있습니다.
printf -v JSON '[{"Address":"%s","Backup":false,"name":"%s:11011","port":6745,"targetId":"%s","weight":1}]' "$ABC" "$ABC" "$DFG"
또는 JSON 처리 도구를 사용하여 변수 값이 있는 모든 극단적인 경우를 처리합니다.
JSON=$(
jq -n -c --arg a "$ABC" --arg b "$DFG" '[{
Address: $a,
Backup: false,
name: ($a + ":11011"),
port: 6745,
targetId: $b,
weight: 1
}]'
)
echo "$JSON"
산출
[{"Address":"100000","Backup":false,"name":"100000:11011","port":6745,"targetId":"600000","weight":1}]
답변2
JSON 문서에 셸 변수 값을 삽입하면 인코딩 특수 값 누락으로 인해 JSON 문자열이 손상될 수 있습니다. JSON 인식 도구를 사용하여 JSON 문서를 생성하고 필요한 값을 삽입하는 것이 더 좋고 더 안정적입니다.
jq
간단한 템플릿을 사용하여 JSON 문서를 작성합니다.
ABC=100000
DFG=600000
jq -n \
--arg Address "$ABC" \
--arg targetId "$DFG" \
--arg name "$ABC:11011" \
'[ $ARGS.named + { Backup: false, port: 6745, weight: 1 } ]'
출력( "컴팩트" 출력을 얻으려면 jq
with 사용):-c
[
{
"Address": "100000",
"targetId": "600000",
"name": "100000:11011",
"Backup": false,
"port": 6745,
"weight": 1
}
]
그러면 값이 포함된 일부 명명된 필드를 추가하는 정적 개체인 단일 요소의 배열이 생성됩니다. 필드 이름(키)과 해당 값은 --arg key value
명령줄에서 재사용됩니다.
이를 사용하여 JSON 문서를 생성하므로 유사한 값 (예: 따옴표, 줄 바꿈 또는 탭 등이 포함된 경우) 을 보유 jq
하는 경우에도 여전히 작동합니다 .ABC
100 "My Road"
답변3
또한 여기에 있는 문서를 사용하여 JSON 구조의 확장된 형식으로 변수를 채울 수 있으므로 사람들이 더 쉽게 읽고 유지 관리할 수 있으며, 인용을 피하기 위해 많은 백슬래시를 사용할 필요 없이 중간에 있는 셸 변수 값을 바꿀 수 있습니다. 문자:
f_name=Sotto
l_name=Voce
JSON=$(cat - <<EOJSON
{
"first_name": "${f_name}",
"last_name": "${l_name}",
"full_name": "${f_name} ${l_name}"
}
EOJSON
)
그런 다음 다음 echo "${JSON}"
을 echo "$JSON"
출력합니다.
{
"first_name": "Sotto",
"last_name": "Voce",
"full_name": "Sotto Voce"
}
내 개인 스타일은 변수 이름 주위에 중괄호를 사용하지만 여기서는 필요하지 않습니다. $f_name
이 경우에도 작동합니다.
나는 여기서 문서를 문자열 참조의 또 다른 유형으로 생각하기 시작했습니다. 전체 문자열은 작은따옴표나 큰따옴표를 사용하여 인용되지 않으므로 일반적으로 역따옴표를 사용하여 이스케이프할 필요가 없습니다.