使用Bash脚本循环遍历AWS命令行客户端的输出

15
我正在获取EC2实例列表,然后尝试循环遍历它们,但出于某种原因我无法使循环工作。 <p><code>output="$(aws ec2 describe-instances --filters 'Name=tag:Environment,Values=development' --query '[Reservations[*].Instances[*].PublicDnsName]' --output text)"</code></p> <p><code>echo $output</code> 显示类似以下内容:

ec2-55-55-555-555.eu-west-1.compute.amazonaws.com
ec2-66-66-666-666.eu-west-1.compute.amazonaws.com

然后我创建一个这样的数组:

instances=(${output//'\n'/ })

echo ${instances[0]}echo ${instances[1]}输出正确。

然后尝试遍历数组:

for i in "${instances[@]}"; do echo instance: "$i"; done

但输出以下内容:

instance: ec2-55-55-555-555.eu-west-1.compute.amazonaws.com instance: ec2-66-66-666-666.eu-west-1.compute.amazonaws.com

而不是:

instance: ec2-55-55-555-555.eu-west-1.compute.amazonaws.com
instance: ec2-66-66-666-666.eu-west-1.compute.amazonaws.com

我哪里做错了?有没有更好的方法来循环遍历结果,也许可以使用 JSON 输出格式而不是当前的方法?


尝试运行 for i in $output; do echo $i; done - alnet
1
我已经尝试过了,它会回显整个变量。并没有分割行。 - Mikhail Janowski
2
for i in "${instances[@]}"; do ...是什么意思? - alnet
1
另请参见Bash FAQ 001,了解如何正确地从流中逐行读取。 - Etan Reisner
在 Codeship 上,$output 是以空格分隔的,有人知道为什么吗?我添加了 tr ' ' '\n' 现在它可以工作了。 - Mikhail Janowski
显示剩余2条评论
5个回答

24

我不确定你是否已经得到了这个问题的答案。这样做会有帮助吗?

for dns in $(aws ec2 describe-instances --region ap-northeast-1 --query 'Reservations[*].Instances[*].PublicDnsName' --output text) ; do echo $dns ; done

1
我们如何在多列中实现这个? - wheeleruniverse

1

对我也适用,将其添加到一个bash数组中:

for instance in $(aws ec2 describe-instances --filters "Name=tag:Application,Values=yourValue" "Name=tag:Environment,Values=development" --query 'Reservations[*].Instances[*].InstanceId' --output text); do envInstances+=(${instance}); done

for i in ${envInstances[@]}; do echo "hello $i"; done

hello i-instance1
hello i-instance12
hello i-instance16

1

针对Windows命令行:

aws ec2 describe-instances --query "Reservations[].Instances[].InstanceId" > instances

FOR /f %i IN (instances) DO aws ec2 terminate-instances --instance-ids %i


2
问题要求编写一个Bash脚本。 - GS - Apologise to Monica
1
但很有用。点赞。 - Jehong Ahn

0

不确定你是否已经放弃了,但在BASH中,最好只是这样做:

OUTPUT=($(aws ec2 describe-instances --filters 'Name=tag:Environment,Values=development' --query '[Reservations[].Instances[].PublicDnsName]' --output text))

然后(如果您想要计数)

echo "${#OUTPUT[@]} instances found."

祝你好运!


0

使用 xargs 的一行命令:

aws ec2 describe-instances --filters 'Name=tag:Environment,Values=development' --query '[Reservations[*].Instances[*].PublicDnsName]' --output text | xargs --no-run-if-empty -n1 echo 'Instance:'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接