Bash if / else语句没有正确输出输出

时间:2018-04-26 16:32:30

标签: bash shell if-statement stdout

我有一个脚本正在查询AWS区域以查找指定的子网掩码。在AWS中,默认的VPC CIDR块是172.31.0.0/16,因此我编写了一个if/else语句来将输出管道输出到/dev/null,然后将所有其他CIDR块写入文本文件。出于某种原因,172.31.0.0/16块仍在写入文本文件。

Code:

#!/bin/bash

get_cidrs() {
for region in `aws ec2 describe-regions --output text | cut -f3`
do
    echo -e "\nGetting subnets in region:'$region'..."
    describe_cidr=`aws ec2 describe-vpcs --region $region | grep '\Block":' | awk 'NR%2==0' | sed 's/CidrBlock": "//g'`

    echo "$describe_cidr"
    if [[ "$describe_cidr"  == "172.31.0.0/16," ]]; then
        echo "$describe_cidr" > /dev/null 2>&1
    else
        echo "$describe_cidr" >> cidr_blocks.txt
    fi
done
}

get_cidrs

Output:

Getting subnets in region:'eu-central-1'...
                    "172.31.0.0/16",

Getting subnets in region:'us-east-1'...
                    "10.247.92.0/23",
                    "10.247.90.0/23",

Text file:

cat cidr_blocks.txt
"172.31.0.0/16",
"10.247.92.0/23",
"10.247.90.0/23",

目标是在文本文件中没有任何"172.31.0.0/16",范围。

1 个答案:

答案 0 :(得分:3)

首先,describe-regions能够输出您想要的区域名称而无需后处理。 (对于describe-vpcs,使用适当的--query选项可能也是如此。)

其次,如果使用适当的工具来解析JSON输出,那么获得所需的CIDR块会更加简单。

get_cidrs () {
    aws ec2 describe-regions --query 'Regions[].{Name:RegionName}' --output text |
      while IFS= read -r region; do
        aws ec2 describe-vpcs --region "$region" |
          jq -r '.Vpcs[].CidrBlock | select(. != "172.31.0.0/16")'
      done > cidr_blocks.txt
}