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

Reading several variables from a single command's multi-line output

我运行遇到读取命令的问题。我正在尝试通过我的 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)'

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

问题是 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 '[=16=]'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 '[=11=]'
)