리눅스에서 json 문자열을 변수로 사용하는 방법

리눅스에서 json 문자열을 변수로 사용하는 방법

작은 스크립트가 있어요

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 } ]'

출력( "컴팩트" 출력을 얻으려면 jqwith 사용):-c

[
  {
    "Address": "100000",
    "targetId": "600000",
    "name": "100000:11011",
    "Backup": false,
    "port": 6745,
    "weight": 1
  }
]

그러면 값이 포함된 일부 명명된 필드를 추가하는 정적 개체인 단일 요소의 배열이 생성됩니다. 필드 이름(키)과 해당 값은 --arg key value명령줄에서 재사용됩니다.

이를 사용하여 JSON 문서를 생성하므로 유사한 값 (예: 따옴표, 줄 바꿈 또는 탭 등이 포함된 경우) 을 보유 jq하는 경우에도 여전히 작동합니다 .ABC100 "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이 경우에도 작동합니다.

나는 여기서 문서를 문자열 참조의 또 다른 유형으로 생각하기 시작했습니다. 전체 문자열은 작은따옴표나 큰따옴표를 사용하여 인용되지 않으므로 일반적으로 역따옴표를 사용하여 이스케이프할 필요가 없습니다.

관련 정보