次の作業コードがあります(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コマンドは気にしません)。
何とか出力(1つ以上、現在2行のIPである$ element)を使用して、次の2つの実行に分類できます。
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
内部(上部)または外部(下部)でさまざまな方法で発生する可能性があります。これには実際には配列コンテキストや繰り返し項目がないため、ループは必要ありません。