我正在尝试编写一个bash脚本来自动执行备份计划。我使用一个脚本,每天创建一个S3文件夹,当天作为文件夹名称。每小时他都会在此文件夹中上传备份。 例如:/Application1/20130513/dump.01
我的备份计划是保留2天完整备份(每小时),并在s3文件夹(“oldbackup”)中保留最近15天的1天备份。
我的剧本有什么问题?
#check and clean the S3 bucket
BUCKETNAME='application1';
FOLDERLIST = s3cmd ls s3://$BUCKETNAME
LIMITFOLDER = date --date='1 days ago' +'%Y%m%d'
for f in $FOLDERLIST
do
if [[ ${f} > $LIMITFOLDER && f != "oldbackup" ]]; then
s3cmd sync s3://$BUCKETNAME/$f/dump.rdb.0 s3://$BUCKETNAME/"oldbackup"/dump.rdb.$f
s3cmd del s3://$BUCKETNAME/$f --recursive;
fi
done
OLDBACKUP = s3cmd ls s3://$BUCKETNAME/"oldbackup"
LIMITOLDBACKUP = date --date='14 days ago' +'%Y%m%d'
for dump in $OLDBACKUP
if [${dump} > $LIMITOLDBACKUP]; then
s3cmd del s3://$BUCKETNAME/"oldbackup"/$dump
fi
done
由于
答案 0 :(得分:1)
首先,您可能希望将FOLDERLIST
存储为数组。你可以这样做:FOLDERLIST=($(command))
。
接下来,您应该始终将您打算使用的命令的输出存储为像OUTPUT="$(command)"
这样的字符串。
例如,您的前三行应如下所示:
BUCKETNAME="application1"
FOLDERLIST=($(s3cmd ls s3://$BUCKETNAME))
LIMITFOLDER="$(date --date="1 days ago" +"%Y%m%d")"
现在你的第一个for循环应该可以工作。
这是我能猜到的唯一一个你的脚本错误(第二个for-loop遭受同样的困扰),但你真的没有给我任何更好的继续。
你的第二个for循环(除了没有迭代正确的数组)没有do
个关键字,所以你应该这样做:
for dump in $OLDBACKUP
do
# rest of loop body
done
这可能是您的脚本的另一个问题。
最后,您只使用OLDBACKUP
和FOLDERLIST
进行迭代。通过这样做可以实现同样的目的:
for f in $(s3cmd ls s3://$BUCKETNAME)
do
# loop body
done
除非您计划多次重复使用,否则无需将输出存储在变量中。
作为一个单独的问题,没有必要使用完全由大写字母组成的变量名。只要您了解使用命令名称将导致错误,您也可以使用基于小写的变量名称。