我正在为我的电子邮件和云服务编写备份脚本。
为了简单起见,我在这里只发布了邮件备份部分。
基本上,我有一台主机,其中运行着一些虚拟盒子。
这些虚拟盒子访问主机,/mnt/alias/storage/
其中有 vmail 文件夹(在我的例子中称为 shishaMail)
(以下可能不是必要信息)
我想说的是,里面的一切/mnt/alias/
都是ln -s
来自/mnt/rack/*
一个有漂亮名字的。
此机架文件夹中包含驱动器的安装座。
(非必要信息完)
这是我的脚本
#!/bin/bash
# backup script
BASEURL="/mnt/alias/backup"
MAILURL="/mnt/alias/storage/shishaMail"
DAY=`eval date +"%d"`
MONTH=`eval date +"%m"`
YEAR=`eval date +"%Y"`
HOUR=`eval date +"%H"`
MINUTE=`eval date +"%M"`
PIMPURL=$BASEURL/$YEAR/$MONTH/$DAY/
COMMAND1="cd $PIMPURL"
$COMMAND1 2>/dev/null
if [ $? -eq 0 ]
then
echo "Command 1 was successful"
else
echo "There ain't folders!!"
echo "I'll mkdir some!"
COMMAND2="mkdir -p $PIMPURL"
$COMMAND2 2>/dev/null
fi
if [ $? -eq 0 ]
then
echo 'Command 1 or/and 2 was successful'
echo "STARTING MAIL BACKUP"
COMMAND3="tar -cvzf '"$PIMPURL"shisha_"$HOUR"_"$MINUTE"_.data.tar.gz' "$MAILURL
echo $COMMAND3
$COMMAND3 2>/dev/null
if [ $? -eq 0 ]
then
echo 'MAIL BACKUP SUCCESSFULL'
else
echo "FAILURE!!"
fi
else
echo 'Nope! Must be some kind of strage Err0r!!'
fi
因此,如果我执行此脚本,则会出现以下错误:
命令 1 成功
命令 1 或/和 2 成功
启动邮件备份
tar -czvf '/mnt/alias/backup/2014/06/13/shisha_10_25_.data.tar.gz' /mnt/alias/storage/shishaMail
tar:从成员名称 tar (子)中删除前导“
/”:'/mnt/alias/backup/2014/06/13/shisha_10_25_.data.tar.gz':无法打开:没有这样的文件或目录
tar(子):错误不可恢复:现在退出
失败!!
正如你所看到的,有一个echo
COMMAND3 ,它是:
tar -czvf '/mnt/alias/backup/2014/06/13/shisha_10_21_.data.tar.gz' /mnt/alias/storage/shishaMail
如果我手动执行此命令,作为我执行脚本的同一用户(在这两种情况下都是 root ),它就会起作用。
我不明白为什么脚本抱怨不存在的文件或目录,因为除了*.tar.gz
文件之外的目录都存在,因为它必须由tar
.
答案1
尝试从 COMMAND3 创建行中删除单引号:
COMMAND3="tar -cvzf "$PIMPURL"shisha_"$HOUR"_"$MINUTE"_.data.tar.gz "$MAILURL
当您手动执行该行时,shell 在 tar 看到参数之前删除引号。
您没有在文件名中插入空格,因此不需要引号。实际上,您可以进一步简化该行:
COMMAND3="tar -cvzf ${PIMPURL}shisha_${HOUR}_${MINUTE}_.data.tar.gz ${MAILURL}"
大括号用于分隔变量名称,否则它会尝试扩展“PIMPURLshisha”,可能不是您想要的。使用它们从来没有坏处,因为它也使变量脱颖而出,更容易挑选。