이전 명령의 결과를 기반으로 하는 필드를 사용하여 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
.