web-dev-qa-db-ja.com

複数の結果をコマンドにパイプする方法は?

私は次のような動作するコードを持っています(これは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)を使用して、次のような2つの実行に集中させることはできますか?

long AWS command >> echo $element $MOUNT_SOURCE  >> /etc/hosts

現在の実装では、配列内の変数と同じ回数だけエコーが実行されますか?これをどのように書き直しますか?

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

8
Michael Homer