
아래 스크립트에서는 두 번째 명령문에서 $var1을 확장할 수 없는 것 같습니다. 나는 $var1
, ${var1}
및 을 시도했습니다 echo $var1
. '$var1'
여러 개의 따옴표와 괄호 안에 있는데 그게 문제의 원인인 것 같아요. 어떤 아이디어가 있나요?
#!/bin/bash
# Get the AutoScalingGroupName for the NameNode ASG
var1=$(aws cloudformation list-stack-resources --stack-name abc123 | jq '.StackResourceSummaries[] | select(.ResourceType=="AWS::AutoScaling::AutoScalingGroup")' | jq '.PhysicalResourceId' | tr -d '"' | grep nn); echo $var1
var2=$(aws autoscaling describe-auto-scaling-instances | jq -r '.AutoScalingInstances[] | select(.AutoScalingGroupName == "$var1") | select(.AvailabilityZone == "us-east-1a") .InstanceId'); echo $var2
답변1
작은따옴표로 묶인 변수는 확장되지 않습니다. 이 시도...
var2=$(aws autoscaling describe-auto-scaling-instances | jq -r '.AutoScalingInstances[] | select(.AutoScalingGroupName == "'"$var1"'") | select(.AvailabilityZone == "us-east-1a") .InstanceId'); echo $var2
답변2
작은따옴표로 묶여 있으므로 확장할 수 없습니다.
jq -r '.AutoScalingInstances[] | select(.AutoScalingGroupName == "$var1") ... .InstanceId'
중요한 부분은 jq
실제로 명령에 하나의 인수만 전달한다는 것입니다(긴빨간색명령의 일부). 따라서 파이프라인도 적용되지 않습니다. 선택적으로 실제로 필요한 내용에 따옴표를 붙일 수 있습니다.
답변3
쉘 변수는 작은따옴표 내에서 확장되지 않습니다.
이 경우 실제로는 그렇지 않습니다.생각하다먼저 JSON 문자열로 인코딩하지 않고 표현식 var1
에 셸 변수를 삽입합니다 . 이는 유틸리티의 옵션을 사용하여 수행하는 작업입니다.jq
--arg
jq --arg name "$var1" '... | select(.AutoScalingGroupName == $name) ...'
이를 통해 쉘 변수에서 JSON으로 인코딩된 문자열을 사용하여 jq
호출되는 변수를 생성할 수 있습니다.name
var1
전체 스크립트는 다음과 같이 작성할 수 있습니다(다른 코드도 단순화함).
#!/bin/sh
resourceId=$(
aws cloudformation list-stack-resources --stack-name abc123 |
jq -r '
.StackResourceSummaries[] |
select(.ResourceType == "AWS::AutoScaling::AutoScalingGroup").PhysicalResourceId |
select(contains("nn"))'
)
instanceId=$(
aws autoscaling describe-auto-scaling-instances |
jq -r --arg name "$resourceId" '
.AutoScalingInstances[] |
select(
.AutoScalingGroupName == $name and
.AvailabilityZone == "us-east-1a"
).InstanceId'
)
printf 'instanceId = "%s"\n' "$instanceId"