대괄호와 따옴표 내의 변수 확장

대괄호와 따옴표 내의 변수 확장

아래 스크립트에서는 두 번째 명령문에서 $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호출되는 변수를 생성할 수 있습니다.namevar1

전체 스크립트는 다음과 같이 작성할 수 있습니다(다른 코드도 단순화함).

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

관련 정보