2017-04-03 14 views
0

私は実際にはbashシェルスクリプトを書いていますが、動作を修正できないようです。このスクリプトは、ファイルとディレクトリの配列を特定のバックアップディレクトリ$ pathにコピーし、.tar.gzファイルに圧縮します。なぜこのシェルスクリプトは `case`を読まずに終了するのですか?

.tar.gzのファイルがすでにバックアップディレクトリ($ date_value.tar.gz)の命名パターンを使用して存在している、との回答に応じて特定のケースを持っていると述べた場合、私が働いているの反復はチェックする必要があります。このスクリプトは今のところメインプロジェクトディレクトリから実行される予定です。

次のコードは間違っている部分です。

if [ -f "$path/$date_value.tar.gz" ] ; then 

    echo "A $date_value.tar.gz directory already exists." 

    read -p "Do you wish to update directory ? (Y/N)" 

    echo # Moves to new line; for user experience purpose only 

    case $REPLY in 

     # Case when user wrote "Y" or "y" as in Yes 
     " [[ $REPLY =~ ^[Yy]$ ]] ") 

      # Extract archive 
      tar xf "$path/$date_value.tar.gz" 

      # Synchronise directories 
      rsync --update -raz --progress \ 
        --include="$current_path${files_array[@]}" "$path/$date_value" \ 
        --exclude="*" 

    exit 0; 
;; 

     # Case when user wrote anything else 
     " [[ $REPLY =~ ^[*]$ ]] ") 

      echo "Script didn't make any change and stopped itself." 

    exit 1; 
esac 

# Else if backup directory doesn't exist yet 
else 

    # Make a directory using the date 
    mkdir "$path/$date_value" 

    # Loops over the whole array and copies files/directories 
    # recursively to given directory with current rights 
    for i in ${files_array[@]}; do 
      cp -ar ${i} /home/robin/backup/by_date/"$date_value"/ 
    done 

    # Goes to backup directory 
    cd "$path" 

    # Compress backup directory into tarball AND(=&&) removes it if successfull 
    tar cfM "$date_value.tar.gz" "$date_value" && rm -Rf "$date_value" 

fi 

bash -xモードで実行すると、私はcase $REPLY inラインまで予想通り、それはケースを通じて実行せずに停止し、その後、突然、進行していることがわかります。私はfiの最後の閉鎖の後にexit 1をテストに入れて、それ以上の指示はないので、スクリプトが単にcaseを飛び越えて停止することを確認することができます。

何が間違っているのでしょうか、それはなぜcaseをディッチしていますか?このコードを書くために使用

ドキュメント:

:[]特定の演算子を使用して http://tldp.org/LDP/abs/html/testconstructs.html#DBLBRACKETS
  • テスト建物

    実行時Debianbashをターミナルとして実行します。

  • +4

    ...ケースを想定しているためグロブスになる –

    +1

    http://www.shellcheck.net/にスクリプトを貼り付けて、構文エラーを修正してください! – Inian

    +0

    投稿した最初のリンクの2番目のグレーのボックスを見てください。この例では、変数を1、2、3(数字)と比較します。後続の例はさらに完全であり、複雑な '[[$ REPLY ...]]'を使うことはありません。あなたはあなたの質問を本当にうまく書いた、いい仕事ですが、あなた自身が投稿したリンクを読むべきです! – linuxfan

    答えて

    2

    誤:

    " [[ $REPLY =~ ^[Yy]$ ]] ") 
    

    正しい:

    [Yy]) 
    

    ありOPコード内の他のエラーがありますが、それで始まる...

    +2

    グロブ内の '^'は行の先頭ではなく、 '^'と一致します。 'Y | y)'を試してください。 –

    +0

    @WilliamPursell、修正しました。 – agc

    +0

    @WilliamPursellが指摘したように、 '^'は文字通り^にマッチし、私の場合はまだ見過ごされていました。しかし、 'Y | y)'と '*)'への変更はうまくいきました。あなたがた両方に感謝します ! – Apweleleh

    関連する問題