1

对于课堂,我们必须在学校托管的远程服务器上工作。到目前为止,我已经在服务器上制作了很多文件,我想备份它们,以防我想将它们传输到我的笔记本电脑,或者我不小心删除了一个目录或犯了一个愚蠢的错误。我找到了一个教程和一个脚本来备份文件,我决定对其进行修改,以便确定它所在的目录(这将是主用户的目录)和文档的 cd。如果目录不存在,它还会创建目录 Backups。我对这种脚本仍然很陌生,任何额外的建议或帖子链接将不胜感激。

代码:

#!/bin/bash
#######################################################
##       Simple backup script..   
## Created by Matthew Brunt: (openblue555@gmail.com)
## Licensed under GNU GPL v3 or later, at your option.
##   http://www.gnu.org/licenses/gpl.html
##
## Further edited by Michael Garrison to backup the 
## directory it is located in and print the contents.
#######################################################

mkdir -p Backup

#Defines our output file
OUTPUT= $( cd Backup && pwd )/backup_$(date +%Y%m%d).tar.gz

#Defines our directory to backup
BUDIR=$( cd Desktop && pwd )
#Display message about starting the backup
echo "Starting backup of directory $BUDIR to file $OUTPUT"

#Start the backup
tar -cZf $OUTPUT $BUDIR

#Checking the status of the last process:
if [ $? == 0 ]; then
        #Display confirmation message
    echo "The file:"
        echo $OUTPUT
    echo "was created as a backup for:"
        echo $BUDIR

        echo ""
    echo "Items that were backed up include:"

    for i in $BUDIR; do
            echo $i
    done
        echo ""
else
    #Display error message message
        echo "There was a problem creating:"
        echo $OUTPUT
    echo "as a backup for:"
    echo $BUDIR
fi

我知道原始脚本有效,并且在我更改$OUTPUT变量之前一直有效。我目前得到以下结果:

./backup.sh
./backup.sh: line 15: /Users/mgarrison93/Backup/backup_20121004.tar.gz: No such file
or directory
Starting backup of directory /Users/mgarrison93/Desktop to file 
tar: no files or directories specified
There was a problem creating:

as a backup for:
/Users/mgarrison93/Desktop

我可以看到它不接受文件名,但我不知道如何更正。

我只是尝试更改$OUTPUT/Backups/file-name.tar.gz我最初拥有的并且效果很好。问题似乎是$( cd Backup && pwd )/backup_$(date +%Y%m%d).tar.gz。只是不确定出了什么问题。

4

1 回答 1

2

考虑这两种完全不同的 bash 语法:首先,您有将变量永久设置为值的语法(在当前脚本中),

<variable>=<value>

然后是运行命令的语法,其中一个变量临时设置为一个值,

<variable>=<value> <command> <argument> ...

这两者的区别在于空间。之后=,一旦 bash 遇到一个未加引号的空格,它就意味着<value>已经结束,并且它之后的任何内容都被解释为<command>.

在脚本的这一行中,

OUTPUT= $( cd Backup && pwd )/backup_$(date +%Y%m%d).tar.gz

后面有空格OUTPUT=。bash 将其解释OUTPUT为将(临时)设置为空字符串,而该行的其余部分,即 的结果$( cd Backup && pwd )/backup_$(date +%Y%m%d).tar.gz,是要运行的命令和参数,同时OUTPUT等于空字符串。

解决方案是删除空间。这样 bash 就会知道您正在尝试将行的其余部分作为值分配给变量。

于 2012-10-04T07:15:03.720 回答