括号和引号内的变量扩展

括号和引号内的变量扩展

在下面的脚本中,我似乎无法在第二条语句中扩展 $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

Shell 变量不在单引号内扩展。

在这种情况下,你实际上并不将 shell 变量注入表达式var1jq,而不首先将其编码为 JSON 字符串,这就是您使用--arg实用程序的选项所做的事情:

jq --arg name "$var1" '... | select(.AutoScalingGroupName == $name) ...'

这样,您就可以创建一个使用 shell 变量中的 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"

相关内容