从单个命令的多行输出中读取多个变量
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=]'
)
我运行遇到读取命令的问题。我正在尝试通过我的 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=]'
)