【问题标题】:Loop in bash until there are no unique result在bash中循环直到没有唯一的结果
【发布时间】:2020-04-09 17:40:38
【问题描述】:

我使用 bash 创建了函数来检索 EC2 SnapshotIds 并将列表输出到文本文件。我使用了一个 for 循环:

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} 某些行是空的。如何循环输出唯一的 SnapshotId,以便在检索到所有唯一的 SnapshotId 时停止循环?使用while循环更好吗?你有什么建议?

【问题讨论】:

  • 脚本运行 20 次 ({0..20}。这里是示例输出:"snap-lkjjsd813beaca2asdf" "snap-12346b9301b0eabsd" null null null null null null null null null null null null null null “snap-1111c2a279f0deder”。我希望在没有更多唯一快照 ID 时停止循环。我该怎么做?
  • 嗨 - 我已经在上面添加了整个脚本。如前所述,如何让脚本仅在某些行上打印唯一的快照 ID 而不是 0。理想情况下,我希望查看卷的最新 SnapshotId。

标签: bash for-loop amazon-ec2


【解决方案1】:

以下解决方案假定“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

$(...) 在子shell 中运行命令。分配捕获标准输出。 如果命令成功(aws 命令处理了一个有效的卷),捕获的输出将附加到文件中。

注意:我无权访问 aws 命令。

【讨论】:

  • 嗨 - 谢谢!结果返回一堆空值,只有 1 个 snap-id: Retrieving 20 SnapshotIds null null "snap-yyy456ss899z54321" null null null null null null null null null null null null null null null null
【解决方案2】:

在 bash 中,循环可以与管道一起使用。这意味着我们可以有一个相当简单的循环,并在后面的步骤中对结果进行后处理。

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 在后期处理后已被进一步向下移动。

后处理本身将原始快照 ID 列表通过管道传输到 sort,然后是 uniq。这些工作一起收集然后消除重复项。接下来是一个 grep,它将过滤掉 null 行(这些是问题吗?不是很清楚。)然后将结果发送到输出文件。

通过这种方法,我删除了echo,以防止它与循环外的其他输出混为一谈。如果它是必要的,你也许可以将它重新添加,但输出到stderr1>&2 echo "Retrieving ..."

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多