![括号和引号内的变量扩展](https://linux22.com/image/69958/%E6%8B%AC%E5%8F%B7%E5%92%8C%E5%BC%95%E5%8F%B7%E5%86%85%E7%9A%84%E5%8F%98%E9%87%8F%E6%89%A9%E5%B1%95.png)
在下面的脚本中,我似乎无法在第二条语句中扩展 $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 变量注入表达式var1
中jq
,而不首先将其编码为 JSON 字符串,这就是您使用--arg
实用程序的选项所做的事情:
jq --arg name "$var1" '... | select(.AutoScalingGroupName == $name) ...'
这样,您就可以创建一个使用 shell 变量中的 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"