L oop в bash, пока не будет уникального результата - PullRequest
0 голосов
/ 09 апреля 2020

Я создал функцию, используя bash, чтобы получить EC2 SnapshotIds и вывести список в текстовый файл. Я использовал для l oop:

for i in {0..20} ; do
  aws ec2 describe-snapshots \
    --filters Name=description,Values="*TestVolume$i*" \
    --query "reverse(sort_by(Snapshots, &StartTime))[0].SnapshotId" \
    >> GetSnapId
done

Выше выводит содержимое, но в выходном файле есть пробелы из-за {0..20}, где какая-то строка пуста. Как я могу l oop вывести уникальные SnapshotIds, чтобы l oop останавливался при получении всех уникальных SnapshotIds? Использование в то время как L oop лучше? Что бы вы предложили?

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

В bash петли могут использоваться вместе с трубами. Это означает, что мы можем иметь довольно простой l oop и постобработать результаты на более позднем шаге.

for i in {0..20}
do
  aws ec2 describe-snapshots --filters Name=description,Values="*TestVolume$i*" --query "reverse(sort_by(Snapshots, &StartTime))[0].SnapshotId"
done | sort | uniq | grep snap > GetSnapId

Обратите внимание, что > GetSnapId был перемещен еще ниже, после постобработки .

Сама постобработка направляет необработанный список идентификаторов привязки в sort, а затем uniq. Они работают вместе, собирают и затем удаляют дубликаты. Далее идет grep, который отфильтровывает строки null (это проблема? Это было не очень понятно.) Затем результат отправляется в выходной файл.

При таком подходе я удалил echo для предотвращения его объединения с другим выходом, выходящим из l oop. Если это необходимо, вы можете добавить его обратно, но вывести в stderr: 1>&2 echo "Retrieving ..."

0 голосов
/ 10 апреля 2020

В следующем решении предполагается, что «aws» возвращает соответствующий результат.

#!/bin/bash
echo "Start of Function.."
getLatestSnap() {
    for i in {0..20}
    do
     echo "Retrieving $i SnapshotIds"
     capture=$(aws ec2 describe-snapshots --filters  Name=description,Values="*TestVolume$i*" --query "reverse(sort_by(Snapshots, &StartTime))[0].SnapshotId")
     result=$?
     if ((result == 0))
     then
        echo $capture >> GetSnapId
     fi
    done
}

getLatestSnap
cat GetSnapId

$ (...) запускает команду в подоболочке. Назначение захватывает стандартный вывод. Если команда выполнена успешно (команда aws обработала допустимый том), захваченный вывод добавляется в файл.

Примечание. У меня нет доступа к команде aws.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...