2012-10-04 9 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 

나는 그것이 파일 이름을 수락하지 않는 것을 볼 수 있습니다,하지만 난이 문제를 해결하는 방법을 모른다 : 저는 현재 다음과 같은 결과를 얻을.

방금 ​​원래 시도했던 /Backups/file-name.tar.gz으로 $OUTPUT을 변경해 보았습니다. 정상적으로 작동합니다. 문제는 $(cd Backup && pwd)/backup_$(date +%Y%m%d).tar.gz 인 것 같습니다. 무엇이 잘못되었는지 확실하지 않습니다.

<variable>=<value> 

, 첫째, 당신은 (현재 스크립트에) 영구적 값에 변수를 설정하기위한 구문이 다음 실행 구문이 :

+1

'OUTPUT ='다음에 공백을 제거해보십시오. (그것이 수정 된 이유를 설명하는 답변을 게시 할 것입니다) –

+0

이제 완벽하게 작동합니다! –

답변

2

bash는 구문이 두 완전히 다른 조각을 고려 변수를 일시적으로 값으로 설정 한 명령

<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

고맙습니다. 나는'= '기호 앞뒤에 공백을 둘 수있는 다른 프로그래밍 언어를 사용하는 데 익숙합니다. 어제는 처음 시작한 날이었습니다. 그리고 제가 따르는 자습서에서는 원본 스크립트를 작성하는 방법에 대해 언급하지 않았습니다. –

관련 문제