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

これら 2 つのまったく異なる bash 構文について考えてみましょう。まず、(現在のスクリプトで) 変数に値を永続的に設定するための構文があります。

<variable>=<value>

次に、変数を一時的に値に設定してコマンドを実行するための構文があります。

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

この2つの違いはスペースです。の後、=bash が引用符で囲まれていないスペースに実行されると、それ<value>が終了したことを意味し、それ以降は . として解釈されます<command>

スクリプトのこの行では、

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

の後にスペースがありますOUTPUT=。bashOUTPUTは、 が (一時的に) 空の文字列に設定されることを意味すると解釈し、行の残りの部分、つまり の結果は、 が空の文字列に等しいときに$( cd Backup && pwd )/backup_$(date +%Y%m%d).tar.gz実行されるコマンドと引数です。OUTPUT

解決策は、スペースを削除することです。そうすれば、bash は、行の残りの部分を値として変数に代入しようとしていることを認識します。

于 2012-10-04T07:15:03.720 に答える