如何将多个结果传递到一个命令中?

如何将多个结果传递到一个命令中?

我有一段有效的代码,如下所示(请注意,这是在用于 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(顶部)或外部(底部)以各种方式发生。这里实际上没有任何数组上下文或任何重复的内容,因此您不需要循环。

相关内容