Digitalocean DOCTL和Bash循环-难倒

Digitalocean DOCTL和Bash循环-难倒,bash,digital-ocean,Bash,Digital Ocean,到目前为止,此脚本仍然有效: #!/bin/bash # script to create digitalocean droplet snapshot using their CLI, doctl. # Function to set variable for snapshot name as date/time of creation. timestamp() { NAME=$(date) } timestamp doctl compute droplet-action snapshot

到目前为止,此脚本仍然有效:

#!/bin/bash
# script to create digitalocean droplet snapshot using their CLI, doctl.

# Function to set variable for snapshot name as date/time of creation.
timestamp() {
NAME=$(date)
}

timestamp

doctl compute droplet-action snapshot --snapshot-name "$NAME" 80750079
该脚本的工作结果是以创建日期/时间为名称的水滴快照。 但是,我只需要保留12个快照

不知何故,我需要计算现有快照的数量,当我有12个快照时,删除最旧的快照并添加一个新快照

我怎样才能做到这一点

我每两小时运行一次脚本


谢谢

使用数组。下面是一个使用简单bash命令的示例

declare -a alphabet=(); 
index=0;
for letters in {a..z}; do     
    alphabet[$((index++))]=$letters; 
    sleep 1; 
done
  • 要查看数组中的所有元素:
    printf'%s\n'${alphabet[@]}
  • 要访问特定元素,请使用其索引。例如,要访问字母b,可以执行以下操作:
    printf'%s\n'${alphabet[1]}
  • 注意:数组的索引从0开始
  • 您可以使用
    ${#alphabet[@]}

在意识到我可以获取doctl输出并生成一个数组后,我设法回答了自己的问题。绊脚石是没有意识到这一点

以下是代码,供将来参考。也许它会帮助某人。 顺便说一句,doctl是数字海洋CLI

#!/bin/bash
exec &> do_snapshot.log

timestamp() {
NAME=$(date)
}

timestamp

SNAPSHOTS=$(/snap/bin/doctl compute image list-user --format "ID" --no-header | wc -l)

if [ "$SNAPSHOTS" -gt 23 ]; then
mapfile -t IDLIST < <(/snap/bin/doctl compute image list-user --format "ID" --no-header)

OLDEST=${IDLIST[0]}

/snap/bin/doctl compute image delete "$OLDEST"
fi

/snap/bin/doctl compute droplet-action snapshot --snapshot-name "$NAME" 8Xxxxxx0079

mail -s "Digital Ocean Hourly Snapshot" my email@gmail.com < do_snapshot.log

rm do_snapshot.log

exit 0
#/bin/bash
exec&>do_snapshot.log
时间戳(){
名称=$(日期)
}
时间戳
快照=$(/snap/bin/doctl计算映像列表用户--格式“ID”--无标题| wc-l)
如果[“$SNAPSHOTS”-gt 23];然后

mapfile-t IDLIST<听起来很棒;你们试过什么?你们不能直接使用
logrotate
吗?我遵循你们的例子,但我必须弄清楚如何使用doctl获取快照数组。不过,感谢您对使用数组的指导:)我不知道什么是
doctl
,也不知道水滴快照的输出可能是什么样子。但不管怎样,如果您想要存储、索引和替换多个值,数组是一种可行的方法。Bash语法会使它们看起来比实际更复杂。