私は実際には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://linuxcommand.org/wss0120.php
- Check if a directory exists in a shell script
- テスト建物:Bash regex =~ operator
実行時Debian、bash
をターミナルとして実行します。
...ケースを想定しているためグロブスになる –
http://www.shellcheck.net/にスクリプトを貼り付けて、構文エラーを修正してください! – Inian
投稿した最初のリンクの2番目のグレーのボックスを見てください。この例では、変数を1、2、3(数字)と比較します。後続の例はさらに完全であり、複雑な '[[$ REPLY ...]]'を使うことはありません。あなたはあなたの質問を本当にうまく書いた、いい仕事ですが、あなた自身が投稿したリンクを読むべきです! – linuxfan