2012-10-04 83 views
1

對於類,我們有一個遠程服務器,學校的主機上運行。到目前爲止,我已經做了很多的文件在服務器上,我想對它們進行備份的情況下,我想將它們傳輸到我的筆記本電腦或萬一我不小心刪除一個目錄或作出一個愚蠢的錯誤。我發現了一個教程和一個腳本來備份文件,我決定修改它,這樣它會確定它就是目錄(這將是主要用戶)和CD的文件。如果備份不存在,它還會創建目錄。對於這類腳本,我仍然很陌生,任何額外的建議或帖子鏈接都將不勝感激。腳本將無法識別的文件/目錄

代碼:

#!/bin/bash 
####################################################### 
##  Simple backup script.. 
## Created by Matthew Brunt: ([email protected]) 
## 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

嘗試刪除'OUTPUT ='後面的空格,這是否做了什麼? (如果修復它,我會發布解釋原因的答案) –

+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等於空字符串。

解決方法是刪除空間。這樣bash會知道你正在試圖將該行的其餘部分作爲一個值分配給該變量。

+0

非常感謝。我習慣於使用其他編程語言,在'='符號之前和之後可以有空格。昨天是我第一天玩這個遊戲,我跟着的教程展示瞭如何構建原始腳本並沒有提到這一點。 –

相關問題