脚本无法识别文件/目录

时间:2012-10-04 05:37:38

标签: macos bash terminal

对于课程,我们必须在学校托管的远程服务器上工作。到目前为止,我已经在服务器上制作了很多文件,我想备份它们,以防我想将它们传输到我的笔记本电脑或者我不小心删除目录或犯了一个愚蠢的错误。我找到了一个备份文件的教程和脚本,我决定对其进行修改,以便确定它所在的目录(将是主要用户)和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。只是不确定是什么问题。

1 个答案:

答案 0 :(得分: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的命令和参数。 {1}}等于空字符串。

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