Bash에 변경 가능한 키가 있는 JSON

Bash에 변경 가능한 키가 있는 JSON

다음 bash 스크립트에는 JSON 개체가 있으며 (예: , ) hostname와 같은 임의의 이름을 가진 키가 필요합니다 . 어떻게 하나요?host-$NAMEhost-1host-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 문서에 삽입할 수 있습니다. 이 특별한 경우에는 상당히 안전해야 하지만 일반적으로 따옴표 및 줄 바꿈과 같은 문자를 적절하게 처리하는 방법을 아는 도구를 사용하고 싶을 것입니다.

사용joJSON 문서를 만듭니다.

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

두 경우 모두에 유의하세요.

  1. 문자열이 $name올바르게 JSON으로 인코딩되었습니다. 이는 나중에 $name인코딩해야 할 다른 임의의 문자열이어야 한다고 결정될 수 있으므로 중요합니다 .
  2. jo/의 출력은 jq쉘 변수에 저장되지 않습니다. 생성된 JSON 문서를 출력하는 데에만 관심이 있으므로 이는 필요하지 않습니다.

관련 정보