다음 bash 스크립트에는 JSON 개체가 있으며 (예: , ) hostname
와 같은 임의의 이름을 가진 키가 필요합니다 . 어떻게 하나요?host-$NAME
host-1
host-3
#!/bin/bash
NAME=($(( ( RANDOM % 10 ) + 1 )))
OUTPUT='{
"hostname": "host-$NAME",
"plan": "baremetal_0",
"operating_system": "coreos_stable"
}'
echo $OUTPUT
스크립트 출력은 다음과 같습니다
$ ./packet-ask.sh
{ "hostname": "host-$NAME", "plan": "baremetal_0", "operating_system": "coreos_stable" }
답변1
이 시도:
OUTPUT='{
"hostname": "host-'$NAME'",
...
답변2
문제는 쉘이 작은따옴표로 묶인 문자열 내부의 변수를 확장하지 않는다는 것입니다. 또 다른 작은 점은 NAME
변수가 실제로 발생한다는 것입니다.대량으로값을 할당하는 방식 때문에( NAME=(...)
). OUTPUT
따옴표 없이 변수를 사용할 수도 있습니다 (이렇게 하면 해당 내용이 공백으로 분할되고 생성된 모든 단어에 파일 이름 글로빙이 적용됩니다). 따옴표를 사용하여 echo
(경우에 따라 출력되는 데이터가 수정될 수 있음) 사용할 수도 있습니다.
JSON 문서를 생성하는 보다 안전한 방법을 고려해보세요. 그렇지 않다언제나셸 문자열을 JSON 문서에 삽입할 수 있습니다. 이 특별한 경우에는 상당히 안전해야 하지만 일반적으로 따옴표 및 줄 바꿈과 같은 문자를 적절하게 처리하는 방법을 아는 도구를 사용하고 싶을 것입니다.
사용jo
JSON 문서를 만듭니다.
#!/bin/bash
printf -v name 'host-%s' "$(( 1 + (RANDOM % 10) ))"
jo hostname="$name" plan='baremetal_0' operating_system='coreos_stable'
사용jq
동일한 작업을 수행합니다.
#!/bin/bash
printf -v name 'host-%s' "$(( 1 + (RANDOM % 10) ))"
jq -n -c --arg name "$name" \
'{ "hostname": $name, "plan": "baremetal_0", "operating_system": "coeros_stable" }'
두 경우 모두에 유의하세요.
- 문자열이
$name
올바르게 JSON으로 인코딩되었습니다. 이는 나중에$name
인코딩해야 할 다른 임의의 문자열이어야 한다고 결정될 수 있으므로 중요합니다 . jo
/의 출력은jq
쉘 변수에 저장되지 않습니다. 생성된 JSON 문서를 출력하는 데에만 관심이 있으므로 이는 필요하지 않습니다.