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

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

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.

관련 정보