从单个命令的多行输出中读取多个变量

问题描述 投票:0回答:2

我遇到了读取命令的问题。我正在尝试读取并运行 awscli 命令的输出以提取 VPC_ID、VPC_CIDR 和 VPC_NAME。不幸的是,自从升级到 bash 5.0 后它就不再工作了。

下面是代码:

read VPC_ID VPC_CIDR VPC_NAME <<<$(aws ec2 describe-vpcs --filters "Name=tag:Name,Values=${AWS_PROFILE}-vpc" --output json | jq -r '.Vpcs[] | .VpcId,.CidrBlock, (.Tags[]|select(.Key=="Name")|.Value)')

当我跑步时

aws ec2 describe-vpcs --filters "Name=tag:Name,Values=${AWS_PROFILE}-vpc" --output json | jq -r '.Vpcs[] | .VpcId,.CidrBlock, (.Tags[]|select(.Key=="Name")|.Value)'

我得到了预期的输出,但是当我在它前面附加读取命令时,我只能分配第一个变量,其他变量都不能分配......

bash jq aws-cli
2个回答
2
投票

问题是

read
默认情况下会停在它看到的第一个换行符处。 (这可以用
-d
参数覆盖)。您可以通过为每个变量运行单独的
read
或运行
read
并使用不同的字符用作记录分隔符来解决此问题。

第一种方法:

{ read -r VPC_ID && read -r VPC_CIDR && read -r VPC_NAME; } < <(
  aws ec2 describe-vpcs --filters "Name=tag:Name,Values=${AWS_PROFILE}-vpc" --output json \
  | jq -r '.Vpcs[] | .VpcId,.CidrBlock, (.Tags[]|select(.Key=="Name")|.Value)'
)

第二种方法,当内部命令成功时添加

printf '\0'
read -d ''
识别意味着记录已完成:

IFS=$'\n' read -r -d '' VPC_ID VPC_CIDR VPC_NAME < <(
  aws ec2 describe-vpcs --filters "Name=tag:Name,Values=${AWS_PROFILE}-vpc" --output json \
  | jq -r '.Vpcs[] | .VpcId,.CidrBlock, (.Tags[]|select(.Key=="Name")|.Value)' \
  && printf '\0'
)

0
投票

使用现代 bash 和 AWS CLI v2,您可以简化此过程,并且不需要 jq。

read -r VPC_ID VPC_CIDR VPC_NAME< <(aws ec2 describe-vpcs \
  --filters "Name=tag:Name,Values=${AWS_PROFILE}-vpc"  \
  --query "Vpcs[*].[VpcId,CidrBlock,Tags[?Key == 'Name']|[0].Value]" \
  --output text)
© www.soinside.com 2019 - 2024. All rights reserved.