0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【シェルスクリプト④】バックアップを世代管理するシェルスクリプト

Last updated at Posted at 2022-10-16

なぜこのシェルスクリプトを・・・?

バックアップを3世代で管理する必要があったため、作成しました。

動きとしては、下記です。
① 現在の世代管理状況を表示する。
② 引数でどの対象を再編処理するか決める。
③ 対象を世代管理する。
④ 再編処理後の状況を表示する。

引数は、別のシェルからユーザーに選択させる。(実質引数は、固定になる。)

シェルスクリプトの内容

実行環境:CentOS Linux 7 (Core)

gene.sh
#!/bin/bash

# 画面クリア
clear

# /*-------------------------------------------------------------------------*/
# /*変数定義                                                                 */
# /*-------------------------------------------------------------------------*/

GENE_DIR="/work/test/BackUp/"

# /*-------------------------------------------------------------------------*/
# /*関数定義                                                                 */
# /*-------------------------------------------------------------------------*/

# 再編処理用のシェル関数
gene() {

  # 再編処理の対象を判断(case分岐)
  case $1 in
    MAIN)
      gene1="${GENE_DIR}main/main_bk.tar.gz"
      gene2="${GENE_DIR}main/main_bk.tar.gz.ver1"
      gene3="${GENE_DIR}main/main_bk.tar.gz.ver2"
      ;;
    BRANCH)
      gene1="${GENE_DIR}branch/branch_bk.tar.gz"
      gene2="${GENE_DIR}branch/branch_bk.tar.gz.ver1"
      gene3="${GENE_DIR}branch/branch_bk.tar.gz.ver2"
      ;;
    *)
      echo "引数が間違っています。"
      return 1
  esac

  # 現在の世代管理状況表示
  echo "-------------------------------------------------------------"
  echo "--再編前-----------------------------------------------------"
  ls -l ${gene1%/*}*
  echo "-------------------------------------------------------------"
  echo "-------------------------------------------------------------"

  # 3世代目ファイル削除処理(ファイルの有無も確認)
  if [[ -e $gene3 ]]; then
    rm $gene3 > /dev/null 2>&1
    if [[ $? -eq 0 ]]; then
      echo "$gene3 --> 削除 "
    else
      echo "${gene3}の削除に失敗"
      return 1
    fi
  else
    echo "${gene3}は、存在しない為、再編をスキップします。"
  fi

  # 2世代目ファイル再編処理(ファイルの有無も確認)
  if [[ -e $gene2 ]]; then
    mv -f $gene2 $gene3 > /dev/null 2>&1
    if [[ $? -eq 0 ]]; then
      echo "$gene2 --> $gene3 "
    else
      echo "$gene2 --> ${gene3}の再編に失敗"
      return 1
    fi
  else
    echo "${gene2}は、存在しない為、再編をスキップします。"
  fi

  # 1世代目ファイル再編処理(ファイルの有無も確認)
  if [[ -e $gene1 ]]; then
    mv -f $gene1 $gene2 > /dev/null 2>&1
    if [[ $? -eq 0 ]]; then
      echo "$gene1 --> $gene2 "
    else
      echo "$gene1 --> ${gene2}の再編に失敗"
      return 1
    fi
  else
    echo "${gene1}は、存在しない為、再編をスキップします。"
  fi

  # 再編後の世代管理状況表示
  echo "-------------------------------------------------------------"
  echo "--再編後-----------------------------------------------------"
  ls -l ${gene1%/*}*
  echo "-------------------------------------------------------------"

  return 0
}


# /*-------------------------------------------------------------------------*/
# /* 再編処理開始(3世代ローテーション)                                       */
# /*-------------------------------------------------------------------------*/

echo "$1の再編処理を実施します。(3世代ローテーション)"

if gene $1; then
  echo "-------------------------------------------------------------"
  echo "$1の世代管理が正常終了しました。"
  exit 0
else
  echo "-------------------------------------------------------------"
  echo "$1の世代管理が異常終了しました。"
  exit 1
fi

※ 下記は、改修前のシェル

gene.sh
#!/bin/bash

# 画面クリア
clear

# /*-------------------------------------------------------------------------*/
# /*変数定義                                                                 */
# /*-------------------------------------------------------------------------*/

# リターンコード(変数)の初期化
RC1=""
RC2=""
RC3=""

# バックアップ階層を変数に代入
BACKUP_MAIN="/work/test/BackUp/main/"
BACKUP_BRANCH="/work/test/BackUp/branch/"

# /*-------------------------------------------------------------------------*/
# /* 世代管理(3世代管理)                                                     */
# /*-------------------------------------------------------------------------*/


echo ""$1"の再編処理を実施します。(3世代ローテーション)"
echo "-------------------------------------------------------------"

# 再編処理対象をパターンごとに分けて分岐させる(case文)
case $1 in

    # 再編処理対象が "MAIN" の場合
    "MAIN")

           # 再編前に状態を表示する
           echo "--再編前-----------------------------------------------------"
           ls -l "$BACKUP_MAIN"
           echo "-------------------------------------------------------------"
           echo "-------------------------------------------------------------"

           # 3世代目のファイルの有無を確認(if分岐)
           if [[ -f "$BACKUP_MAIN"main_bk.tar.gz.ver2 ]]; then

            # 3世代目が存在する場合、3世代目のファイルを削除
            rm "$BACKUP_MAIN"main_bk.tar.gz.ver2 > /dev/null 2>&1

            # 削除が正常終了したか判断する(if分岐)
            RC1=$?
             if [[ $RC1 -eq 0 ]]; then

              # 削除が正常終了ならば、ユーザーに削除通知
              echo "main_bk.tar.gz.ver2 --> 削除 "

             # 削除が異常終了ならば、ユーザーに失敗通知
             else
              echo "main_bk.tar.gz.ver2の削除に失敗"
             fi

           # 3世代目が存在しない場合、再編をスキップ
           else
            echo "main_bk.tar.gz.ver2は、存在しない為、再編をスキップします。"
            RC1=0
           fi
 
           # 2世代目のファイルの有無を確認(if分岐)
           if [[ -f "$BACKUP_MAIN"main_bk.tar.gz.ver1 ]]; then

            # 2世代目が存在する場合、2世代目ファイルを3世代目ファイルにリネーム
            mv -f "$BACKUP_MAIN"main_bk.tar.gz.ver1 "$BACKUP_MAIN"main_bk.tar.gz.ver2 > /dev/null 2>&1

            # リネームが正常終了したか判断する(if分岐)
            RC2=$?
             if [[ $RC2 -eq 0 ]]; then

              # リネームが正常終了ならば、ユーザーにリネーム通知
              echo "main_bk.tar.gz.ver1 --> main_bk.tar.gz.ver2 "

             # リネームが異常終了ならば、ユーザーに失敗を通知
             else
              echo "main_bk.tar.gz.ver1 --> main_bk.tar.gz.ver2の再編に失敗"
             fi

           # 2世代目が存在しない場合、再編をスキップ
           else
            echo "main_bk.tar.gz.ver1は、存在しない為、再編をスキップします。"
            RC2=0
           fi

           # 1世代目のファイルの有無を確認(if分岐)
           if [[ -f "$BACKUP_MAIN"main_bk.tar.gz ]]; then

            # 1世代目が存在する場合、1世代目ファイルを2世代目ファイルにリネーム
            mv -f "$BACKUP_MAIN"main_bk.tar.gz "$BACKUP_MAIN"main_bk.tar.gz.ver1 > /dev/null 2>&1

            # リネームが正常終了したか判断する(if分岐)
            RC3=$?
             if [[ $RC3 -eq 0 ]]; then

              # リネームが正常終了ならば、ユーザーにリネーム通知
              echo "main_bk.tar.gz --> main_bk.tar.gz.ver1 "

            # リネームが異常終了ならば、ユーザーに失敗を通知
            else
              echo "main_bk.tar.gz --> main_bk.tar.gz.ver1の再編に失敗"
             fi

           # 1世代目が存在しない場合、再編をスキップ
           else
            echo "main_bk.tar.gzは、存在しない為、再編をスキップします。"
            RC3=0 
           fi

           # 再編後に状態を表示する
           echo "-------------------------------------------------------------"
           echo "--再編後-----------------------------------------------------"
           ls -l "$BACKUP_MAIN"
           echo "-------------------------------------------------------------"
           ;;

  # 再編処理対象が "BRANCH" の場合
  "BRANCH")
           # 再編前に状態を表示する
           echo "--再編前-----------------------------------------------------"
           ls -l "$BACKUP_BRANCH"
           echo "-------------------------------------------------------------"
           echo "-------------------------------------------------------------"

           # 3世代目のファイルの有無を確認(if分岐)
           if [[ -f "$BACKUP_BRANCH"branch_bk.tar.gz.ver2 ]]; then

            # 3世代目が存在する場合、3世代目のファイルを削除
            rm "$BACKUP_BRANCH"branch_bk.tar.gz.ver2 > /dev/null 2>&1

            # 削除が正常終了したか判断する(if分岐)
            RC1=$?
             if [[ $RC1 -eq 0 ]]; then

              # 削除が正常終了ならば、ユーザーに削除通知
              echo "branch_bk.tar.gz.ver2 --> 削除 "

             # 削除が異常終了ならば、ユーザーに失敗通知
             else
              echo "branch_bk.tar.gz.ver2の削除に失敗"
             fi

           # 3世代目が存在しない場合、再編をスキップ
           else
            echo "branch_bk.tar.gz.ver2は、存在しない為、再編をスキップします。"
            RC1=0
           fi

           # 2世代目のファイルの有無を確認(if分岐)
           if [[ -f "$BACKUP_BRANCH"branch_bk.tar.gz.ver1 ]]; then

            # 2世代目が存在する場合、2世代目ファイルを3世代目ファイルにリネーム
            mv -f "$BACKUP_BRANCH"branch_bk.tar.gz.ver1 "$BACKUP_BRANCH"branch_bk.tar.gz.ver2 > /dev/null 2>&1

            # リネームが正常終了したか判断する(if分岐)
            RC2=$?
             if [[ $RC2 -eq 0 ]]; then

              # リネームが正常終了ならば、ユーザーにリネーム通知
              echo "branch_bk.tar.gz.ver1 --> branch_bk.tar.gz.ver2"

             # リネームが異常終了ならば、ユーザーに失敗を通知
             else
              echo "branch_bk.tar.gz.ver1 --> branch_bk.tar.gz.ver2の再編に失敗"
             fi

           # 2世代目が存在しない場合、再編をスキップ
           else
            echo "branch_bk.tar.gz.ver1は、存在しない為、再編をスキップします。"
            RC2=0
           fi

           # 1世代目のファイルの有無を確認(if分岐)
           if [[ -f "$BACKUP_BRANCH"branch_bk.tar.gz ]]; then

            # 1世代目が存在する場合、1世代目ファイルを2世代目ファイルにリネーム
            mv -f "$BACKUP_BRANCH"branch_bk.tar.gz "$BACKUP_BRANCH"branch_bk.tar.gz.ver1 > /dev/null 2>&1

            # リネームが正常終了したか判断する(if分岐)
            RC3=$?
             if [[ $RC3 -eq 0 ]]; then

              # リネームが正常終了ならば、ユーザーにリネーム通知
              echo "branch_bk.tar.gz --> branch_bk.tar.gz.ver1"

             # リネームが異常終了ならば、ユーザーに失敗を通知
             else
              echo "branch_bk.tar.gz --> branch_bk.tar.gz.ver1の再編に失敗"
             fi

           # 1世代目が存在しない場合、再編をスキップ
           else
            echo "branch_bk.tar.gzは、存在しない為、再編をスキップします。"
            RC3=0
           fi

           # 再編後に状態を表示する
           echo "--再編後-----------------------------------------------------"
           ls -l "$BACKUP_BRANCH"
           echo "-------------------------------------------------------------"
           ;;

         # シェルの第一引数が想定外の引数だった場合、ユーザーにお知らせ
         *)
           echo "引数が間違っています。"
           RC1=1
           RC2=1
           RC3=1
           ;;
esac

# /*-------------------------------------------------------------------------*/
# /* 終了処理                                                                */
# /*-------------------------------------------------------------------------*/


# リターンコードを基に処理が正常終了したか判断(条件分岐(if文)で実施)
if [[ $RC1 -eq 0 && $RC2 -eq 0 && $RC3 -eq 0 ]]; then

 # 正常終了の場合、正常終了をユーザーにお知らせし、リターンコード0で終了
 echo "-------------------------------------------------------------"
 echo ""$1"の世代管理が正常終了しました。"
 exit 0

# 異常終了の場合、異常終了をユーザーにお知らせし、リターンコード1で終了
else
 echo "-------------------------------------------------------------"
 echo ""$1"の世代管理が異常終了しました。"
 exit 1
fi

シェルスクリプトの実行結果

バックアップの状況

[root@localhost:/work/test/BackUp]# ls -lR
.:
合計 0
drwxr-xr-x. 2 root root 30 10月 16 22:02 branch
drwxr-xr-x. 2 root root 28 10月 16 22:02 main

./branch:
合計 4
-rw-r--r--. 1 root root 189 10月 16 22:02 branch_bk.tar.gz

./main:
合計 4
-rw-r--r--. 1 root root 187 10月 16 22:02 main_bk.tar.gz

1回目の再編処理の実行結果(引数:"MAIN" )

[root@localhost:/work/test]# ./gene.sh MAIN
MAINの再編処理を実施します。(3世代ローテーション)
-------------------------------------------------------------
--再編前-----------------------------------------------------
合計 4
-rw-r--r--. 1 root root 187 10月 16 22:02 main_bk.tar.gz
-------------------------------------------------------------
-------------------------------------------------------------
/work/test/BackUp/main/main_bk.tar.gz.ver2は、存在しない為、再編をスキップします。
/work/test/BackUp/main/main_bk.tar.gz.ver1は、存在しない為、再編をスキップします。
/work/test/BackUp/main/main_bk.tar.gz --> /work/test/BackUp/main/main_bk.tar.gz.ver1 
-------------------------------------------------------------
--再編後-----------------------------------------------------
合計 4
-rw-r--r--. 1 root root 187 10月 16 22:02 main_bk.tar.gz.ver1
-------------------------------------------------------------
-------------------------------------------------------------
MAINの世代管理が正常終了しました。

2回目の再編処理の実行結果(引数:"MAIN" )

MAINの再編処理を実施します。(3世代ローテーション)
-------------------------------------------------------------
--再編前-----------------------------------------------------
合計 4
-rw-r--r--. 1 root root 187 10月 16 22:02 main_bk.tar.gz.ver1
-------------------------------------------------------------
-------------------------------------------------------------
/work/test/BackUp/main/main_bk.tar.gz.ver2は、存在しない為、再編をスキップします。
/work/test/BackUp/main/main_bk.tar.gz.ver1 --> /work/test/BackUp/main/main_bk.tar.gz.ver2 
/work/test/BackUp/main/main_bk.tar.gzは、存在しない為、再編をスキップします。
-------------------------------------------------------------
--再編後-----------------------------------------------------
合計 4
-rw-r--r--. 1 root root 187 10月 16 22:02 main_bk.tar.gz.ver2
-------------------------------------------------------------
-------------------------------------------------------------
MAINの世代管理が正常終了しました。

3回目の再編処理の実行結果(引数:"MAIN" )

MAINの再編処理を実施します。(3世代ローテーション)
-------------------------------------------------------------
--再編前-----------------------------------------------------
合計 4
-rw-r--r--. 1 root root 187 10月 16 22:02 main_bk.tar.gz.ver2
-------------------------------------------------------------
-------------------------------------------------------------
/work/test/BackUp/main/main_bk.tar.gz.ver2 --> 削除 
/work/test/BackUp/main/main_bk.tar.gz.ver1は、存在しない為、再編をスキップします。
/work/test/BackUp/main/main_bk.tar.gzは、存在しない為、再編をスキップします。
-------------------------------------------------------------
--再編後-----------------------------------------------------
合計 0
-------------------------------------------------------------
-------------------------------------------------------------
MAINの世代管理が正常終了しました。

シェルの引数が間違っている(失敗1)

[root@localhost test]# ./gene.sh XXX
XXXの再編処理を実施します。(3世代ローテーション)
引数が間違っています。
-------------------------------------------------------------
XXXの世代管理が異常終了しました。

再編処理が失敗した場合(失敗2)

MAINの再編処理を実施します。(3世代ローテーション)
-------------------------------------------------------------
--再編前-----------------------------------------------------
合計 4
-rw-r--r--. 1 root root 187 10月 16 22:22 main_bk.tar.gz
-------------------------------------------------------------
-------------------------------------------------------------
/work/test/BackUp/main/main_bk.tar.gz.ver2は、存在しない為、再編をスキップします。
/work/test/BackUp/main/main_bk.tar.gz.ver1は、存在しない為、再編をスキップします。
/work/test/BackUp/main/main_bk.tar.gz --> /work/test/BackUp/main/main_bk.tar.gz.ver1の再編に失敗
-------------------------------------------------------------
MAINの世代管理が異常終了しました。
MAINの再編処理を実施します。(3世代ローテーション)
-------------------------------------------------------------
--再編前-----------------------------------------------------
合計 4
-rw-r--r--. 1 root root 187 10月 16 22:22 main_bk.tar.gz.ver1
-------------------------------------------------------------
-------------------------------------------------------------
/work/test/BackUp/main/main_bk.tar.gz.ver2は、存在しない為、再編をスキップします。
/work/test/BackUp/main/main_bk.tar.gz.ver1 --> /work/test/BackUp/main/main_bk.tar.gz.ver2の再編に失敗
-------------------------------------------------------------
MAINの世代管理が異常終了しました。
MAINの再編処理を実施します。(3世代ローテーション)
-------------------------------------------------------------
--再編前-----------------------------------------------------
合計 4
-rw-r--r--. 1 root root 187 10月 16 22:22 main_bk.tar.gz.ver2
-------------------------------------------------------------
-------------------------------------------------------------
/work/test/BackUp/main/main_bk.tar.gz.ver2の削除に失敗
-------------------------------------------------------------
MAINの世代管理が異常終了しました。

今回使用したコマンドや構文について

clear コマンド
画面上をクリアするコマンド

~~参考リンク~~
【 clear 】コマンド――端末をクリアする

関数名 () { ~ ;}
一定の処理を関数としてまとめる構文

~~参考リンク~~
【Linux】シェルスクリプトの関数の使い方!一通りまとめ

${パラメータ%パラメータ}
パラメータ値の文字列の右側から伊庭のパターンを取り除く構文

~~参考リンク~~
【シェル芸人への道】Bashの変数展開と真摯に向き合う

case文
文字列をパターンごとに場合分けして、処理を分岐させる。

~~参考リンク~~
【シェルスクリプト】(条件分岐)case文

if文(条件分岐)
条件によって処理を分岐する構文

~~参考リンク~~
if 文と test コマンド

rm コマンド
ファイルを削除するコマンド

~~参考リンク~~
【 rm 】コマンド――ファイルを削除する

mv コマンド
ファイルやディレクトリを移動する/名前を変更するコマンド

~~参考リンク~~
【 mv 】コマンド――ファイルやディレクトリを移動する/名前を変更する

${} ドル波括弧、ドルブレース
変数名の区切りがうまく処理できない場合に使用する。

~~参考リンク~~
[シェル] カッコの意味と役割まとめ [Bash, Linux]

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?