複数の結果を1つのコマンドに渡すには?

複数の結果を1つのコマンドに渡すには?

次の作業コードがあります(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内部(上部)または外部(下部)でさまざまな方法で発生する可能性があります。これには実際には配列コンテキストや繰り返し項目がないため、ループは必要ありません。

関連情報