JSON 문자열의 Bash 변수 대체

JSON 문자열의 Bash 변수 대체

필드 중 하나가 이전 명령의 결과를 기반으로 하는 BASH에서 JSON을 생성하려고 합니다.

BIN=$(cat next_entry)
OUTDIR="/tmp/cpupower/${BIN}"
echo $OUTDIR
JSON="'"'{"hostname": "localhost", "outdir": "${OUTDIR}", "port": 20400, "size": 100000}'"'"
echo $JSON

위 스크립트가 실행되면 다음을 반환합니다.

/tmp/cpupower/0
, port: 20400, size: 100000}': /tmp/cpupower/0

다중 따옴표로 묶인 문자열 내에서 변수를 올바르게 대체하려면 어떻게 해야 합니까?

답변1

JSON=\''{"hostname": "localhost", "outdir": "'"$OUTDIR"'", "port": 20400, "size": 100000}'\'

그것은 확장을 위해 작은 따옴표를 벗어나는 것입니다 $OUTDIR. 스칼라 변수 할당의 경우 꼭 필요한 것은 아니지만 좋은 측정을 위해 해당 확장을 큰따옴표 안에 넣었습니다.

$JSON변수를 에 전달할 때 echo따옴표가 붙습니다.~이다Split+glob 연산자를 비활성화하려면 필요합니다. 또한 echo임의의 데이터에 대해서는 피하는 것이 가장 좋습니다 .

printf '%s\n' "$JSON"

답변2

여기에서 AWS 명령을 사용하려고 했다면 @Stéphane Chazelas의 답변이 거의 작동합니다. 여기서 초기 이스케이프 따옴표(\')는 필요하지 않으며 실제로 명령을 중단합니다.

IP=$(curl ipecho.net/plain ; echo)

aws ec2 authorize-security-group-ingress --group-id sg-**************** \
    --ip-permissions '[{"IpProtocol": "tcp", "FromPort": 15000, "ToPort": 15000, "IpRanges": [{"CidrIp": "'"$IP/32"'", "Description": "Service A"}]}]'

^ 이것은 잘 작동합니다

답변3

Stéphane의 답변은 훌륭하고 찬성되었습니다. 여기에 팁이 있습니다. 하는 대신

BIN=$(cat next_entry)

넌 할 수있어:

BIN=$(<next_entry)

따라서 추가 프로세스 생성을 저장합니다. 더 읽어보세요여기.

답변4

eating.json= 와 같은 json 파일이 있는 경우 {"diner" : {"time" : ""}}다음과 같이 합니다.

declare -a NOW
NOW=$(date) 
jq '.diner.time = "'"${NOW}"'"' eating.json > tmp.$$.json && mv tmp.$$.json eating.json

그래서 먼저 변수를 만든 다음 원하는 값을 입력하고 마지막으로 를 사용하여 jq임시 파일( jq내가 믿는 모듈의 특정 사항)을 수정한 다음 수정 사항을 다시 eating.json.

관련 정보