我有一段有效的代码,如下所示(请注意,这是在用于 AWS 自动部署的 CloudFormation 模板内):
EFS_SERVER_IPS_ARRAY=( $(aws efs describe-mount-targets --file-system-id ${SharedFileSystem} | jq '.MountTargets[].IpAddress' -r) )
echo "IPs in EFS_SERVER_IPS_ARRAY:"
for element in "${EFS_SERVER_IPS_ARRAY[@]}"
do
echo "$element"
echo "$element $MOUNT_SOURCE" >> /etc/hosts
done
这可行但看起来很丑。我想避免数组变量和for
循环(基本上我不关心第一个 echo 命令)。
我可以以某种方式使用输出($element,它是 1 个或多个,当前是 2 行 IP)并将其汇集到类似以下内容的两次执行中:
long AWS command >> echo $element $MOUNT_SOURCE >> /etc/hosts
在当前的实现中,echo 执行的次数与数组中变量的次数一样多?我将如何重写这个?
AWS命令的输出如下:
10.10.10.10
10.22.22.22
然后,添加的行/etc/hosts
如下所示:
10.10.10.10 unique-id.efs.us-east-1.amazonaws.com
10.22.22.22 unique-id.efs.us-east-1.amazonaws.com
答案1
aws efs describe-mount-targets --file-system-id ${SharedFileSystem} \
| jq --arg mntsrc "$MOUNT_SOURCE" '.MountTargets[].IpAddress | . + $mntsrc' -r >> /etc/hosts
或者,如果您愿意,
aws efs describe-mount-targets --file-system-id ${SharedFileSystem} \
| jq '.MountTargets[].IpAddress' -r | sed -e "s~\$~$MOUNT_SOURCE~" >> /etc/hosts
所发生的一切都是在每行末尾添加一些额外的固定文本,这可以在jq
(顶部)或外部(底部)以各种方式发生。这里实际上没有任何数组上下文或任何重复的内容,因此您不需要循环。