1

2013-08-09T14:20:47.000Z という形式のいくつかの Amazon ec2 ボリューム スナップショットの UTC 作成時刻を含む配列があります。

配列の要素を互いに比較して、どれが最も古いスナップショットであるかを判断し、Bash 4 で削除する方法を見つけようとしています。

私が今持っている現在のコード:

#creates a count of all the snapshot volume-id's and deletes oldest snapshot if 
#there are more than 5 snapshots of that volume

declare -A vol_id_count=( ["id_count"]="${snapshot_vols[@]}" )
check_num=5

for e in ${vol_id_count[@]}
do
  if (( ++vol_id_count[$e] > $check_num ))
  then
    echo "first nested if works"
    #compare UTC times to find oldest snapshot
    #snapshot_time=${snapshot_times[0]}

    #for f in ${snapshot_times[@]}
    #do
    #  time= date --date="$snapshot_time" +%s
    #  snapshot_check=${snapshot_times[$f]}
    #  echo "check: "$snapshot_check
    #  check= date --date="$snapshot_check" +%s

    #  if [[ "$snapshot_time" -gt "$snapshot_check" ]]
    #  then
    #    snapshot_time=$snapsnapshot_check
    #    echo "time: "$snapshot_time
    #  fi
    #done

    #snapshot_index=${snapshot_times[$snapshot_time]}
    #aws ec2 delete-snapshot --snapshot-id "${snapshot_ids[$snapshot_index]}"
  fi
done

特定のボリュームのスナップショットが 5 つ以上あるかどうかを確認する最初の for ループと if ステートメントがありますが、UTC 文字列を比較する方法を理解しようとして頭を悩ませています。2 番目の連想配列でうまくいくでしょうか。

4

2 に答える 2

2

これが私がそれを行う方法です: with sort.

dates=(
    2013-08-09T14:20:47.000Z
    2013-08-09T14:31:47.000Z
    )

latest=$(for date in ${dates[@]}
do
    echo $date
done | sort | tail -n 1)

echo $latest # outputs "2013-08-09T14:31:47.000Z"

これは明らかに単なるサンプル スクリプトであり、必要に応じて変更します。次のような関数に簡単に変換できます。

function latest() {
    local dates="$@"
    for date in ${dates[@]}
    do
        echo $date
    done | sort | tail -n 1
}

latest ${dates[@]} # outputs "2013-08-09T14:31:47.000Z"
于 2013-08-09T15:51:06.810 に答える