【シェルスクリプト⑤】世代管理/バックアップ対象をユーザーに選択させるシェルスクリプト

# なぜこのシェルスクリプトを・・・？
対象を固定して、ユーザーに選択させる必要があったため。
これで画面ありシェルスクリプトに近づく・・・。

動きとしては、下記です。
① 対象を選択させる。
② 選んだ対象を基に、世代管理を実施する。
③ 選んだ対象を基に、バックアップを実施する。

# シェルスクリプトの内容
実行環境：CentOS Linux 7 (Core)

```shell:GeneBk.sh
#!/bin/bash

# 画面クリア
clear

# /*-------------------------------------------------------------------------*/
# /*対象選択・確認                                                           */
# /*-------------------------------------------------------------------------*/

# 世代管理/バックアップ対象をユーザーに選択させる
while [[ $TARGET1 -ne 4 ]]; do

  echo "世代管理とバックアップを行う対象を入力してください。"
  echo "----------------------------------------"
  echo " MAIN  なら [1] を入力"
  echo "BRABCH なら [2] を入力"
  echo " 終了  なら [3] を入力"
  echo "----------------------------------------"
  read -p "-> " TARGET1

  case $TARGET1 in
    "1")
        read -p "対象は【MAIN】で正しいでしょうか？ [y/n] -> " check
        
        if [[ $check = "y" || $check = "Y" ]]; then
          TARGET2=MAIN
          TARGET1=4
          clear
        else
          read -p "再度選択してください。(Enter)" push
          clear
        fi
        ;;
    "2")
        read -p "対象は【BRANCH】で正しいでしょうか？ [y/n] -> " check
        
        if [[ $check = "y" || $check = "Y" ]]; then
          TARGET2=BRANCH
          TARGET1=4
          clear
        else
          read -p "再度選択してください。(Enter)" push
          clear
        fi
        ;;
    "3")
        read -p "処理を終了します。(Enter)" push
        clear
        exit 0
        ;;
      *) 
        TARGET1=0
        read -p "値が違います、再度選択してください。（Enter）" push
        clear
        ;;
  esac

done

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

# 再編処理開始
if /work/test/gene.sh ${TARGET2}; then
  :
else
  read -p "異常終了したため、処理を終了します。(Enterで終了)" END
  clear
  exit 1
fi

# /*-------------------------------------------------------------------------*/
# /*バックアップ開始ｘシェルの正常性確認                                     */
# /*-------------------------------------------------------------------------*/

# バックアップ処理開始
if /work/test/BackUp.sh ${TARGET2}; then
  read -p "処理を終了します。(Enterで終了)" END
  clear
  exit 0
else
  read -p "異常終了したため、処理を終了します。(Enterで終了)" END
  clear
  exit 1
fi
```
# シェルスクリプトの実行結果
```text:
[root@localhost：/work/test]# ./GeneBk.sh
```
対象を MAIN [1] で実施してみる。
[ y ] を打鍵してみる。
```text:
世代管理とバックアップを行う対象を入力してください。
----------------------------------------
 MAIN  なら [1] を入力
BRABCH なら [2] を入力
 終了  なら [3] を入力
----------------------------------------
-> 1
対象は【MAIN】で正しいでしょうか？ [y/n] -> y
```
再編処理とバックアップが実施される。（Enterで終了）
```text:
MAINの再編処理を実施します。(３世代ローテーション)
-------------------------------------------------------------
--再編前-----------------------------------------------------
合計 12
-rw-r--r--. 1 root root 187 10月 17 20:51 main_bk.tar.gz
-rw-r--r--. 1 root root 187 10月 17 20:49 main_bk.tar.gz.ver1
-rw-r--r--. 1 root root 187 10月 17 20:47 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.ver2 
/work/test/BackUp/main/main_bk.tar.gz --> /work/test/BackUp/main/main_bk.tar.gz.ver1 
-------------------------------------------------------------
--再編後-----------------------------------------------------
合計 8
-rw-r--r--. 1 root root 187 10月 17 20:51 main_bk.tar.gz.ver1
-rw-r--r--. 1 root root 187 10月 17 20:49 main_bk.tar.gz.ver2
-------------------------------------------------------------
-------------------------------------------------------------
MAINの世代管理が正常終了しました。
MAINのバックアップを取得します。
-------------------------------------------------------------
-rw-r--r--. 1 root root 187 10月 17 21:22 main_bk.tar.gz
-------------------------------------------------------------
MAINのバックアップ取得がが正常終了しました。
処理を終了します。(Enterで終了)
```
[ n ] を打鍵してみる。
```text:
世代管理とバックアップを行う対象を入力してください。
----------------------------------------
 MAIN  なら [1] を入力
BRABCH なら [2] を入力
 終了  なら [3] を入力
----------------------------------------
-> 1
対象は【MAIN】で正しいでしょうか？ [y/n] -> n
再度選択してください。(Enter)
```
Enterを打鍵後、再度選択が求められる。
```text:
世代管理とバックアップを行う対象を入力してください。
----------------------------------------
 MAIN  なら [1] を入力
BRABCH なら [2] を入力
 終了  なら [3] を入力
----------------------------------------
-> 
```
終了[ 3 ] で終了する。（Enterで終了）
```text:
世代管理とバックアップを行う対象を入力してください。
----------------------------------------
 MAIN  なら [1] を入力
BRABCH なら [2] を入力
 終了  なら [3] を入力
----------------------------------------
-> 3
処理を終了します。(Enter)
```
対象外の引数を入力した場合、再度選択を求められる。
```text:
世代管理とバックアップを行う対象を入力してください。
----------------------------------------
 MAIN  なら [1] を入力
BRABCH なら [2] を入力
 終了  なら [3] を入力
----------------------------------------
-> xxx 
値が違います、再度選択してください。（Enter）
```
# 今回使用したコマンドや構文について
:::note warn
clear コマンド
画面上をクリアするコマンド

\~~参考リンク~~
[【 clear 】コマンド――端末をクリアする](https://atmarkit.itmedia.co.jp/ait/articles/1903/14/news026.html)
:::
:::note warn
while文
条件が新である限り（偽になるまで）ループ処理を繰り返す。

\~~参考リンク~~
[while 文の使用方法](https://shellscript.sunone.me/while.html)
:::
:::note warn
read コマンド
標準入力からの入力を変数に出力するコマンド
ユーザーに入力させるコマンドと思ってもOK！

\~~参考リンク~~
[【シェルスクリプト】キーボードからの入力を受け付ける方法](https://www.server-memo.net/shellscript/key_read.html)
:::
:::note warn
case文
文字列をパターンごとに場合分けして、処理を分岐させる。

\~~参考リンク~~
[【シェルスクリプト】（条件分岐）case文](https://www.server-memo.net/shellscript/case.html)
:::
:::note warn
if文(条件分岐)
条件によって処理を分岐する構文

\~~参考リンク~~
[if 文と test コマンド](https://shellscript.sunone.me/if_and_test.html)
:::
:::note warn
条件式の評価 [[~]]
条件式を評価し、その結果によって終了ステータスを返す。
testコマンドとは若干違う。

\~~参考リンク~~
[シェルスクリプト[[]]のススメ](https://blog.denet.co.jp/post/#if%E6%96%87%E3%81%8A%E4%BE%9B_%E3%81%A8)
:::
:::note warn
: コマンド
:（コロン）コマンドは、何もしないで単に[0]の終了ステータスを返すコマンド
while文(ループ)の時や、ファイルサイズ０サイズのファイルを作成する時などに使える。

\~~参考リンク~~
[何もしない組み込みコマンド ":" （コロン）の使い道](https://qiita.com/xtetsuji/items/381dc17241bda548045d)
:::