我遇到了读取命令的问题。我正在尝试读取并运行 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)'
我得到了预期的输出,但是当我在它前面附加读取命令时,我只能分配第一个变量,其他变量都不能分配......
问题是
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'
)
使用现代 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)