【シェルスクリプト⑥】変更前に差分比較対象ファイルを取得するシェルスクリプト

# なぜこのシェルスクリプトを・・・？
適用前後で、差分比較する必要があったため。
対象ファイルの中には、定義が１行で書かれているものや生成される度に並び順が変わってしまうファイルが存在する。そのため差分比較時に変な差分が出てしまうため、整形する必要がある。
なので一部のファイルに関しては、整形をシェルの中で行う。

動きとしては、下記です。
① 取得対象階層を判断し処理する。
② 取得対象ファイルを判断し処理する。(ものによっては、整形が行われる。)
③ 取得したファイルを表示

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

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

```shell:GetDiff.sh
#!/bin/bash
# /*-------------------------------------------------------------------------*/
# /*変数定義                                                                 */
# /*-------------------------------------------------------------------------*/

DIR_S=/work/test/Def


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

# 差分比較用ファイルを取得するための関数
DiffGet() {

  # 対象が"main階層"か"branch階層"か判断する。
  case $1 in
    "main")
      DATA=${DIR_S}/main
      DIF=${DIR_S}/DIF/main
      SHAP=${DIR_S}/DIF/main/SHAP
      ;;
    "branch")
      DATA=${DIR_S}/branch
      DIF=${DIR_S}/DIF/branch
      SHAP=${DIR_S}/DIF/branch/SHAP
      ;;
    *)
      echo "引数が間違っています。"
      return 1
  esac

  # 取得対象ファイルを判断/対象によっては、ファイルを整形するする。
  case $2 in
    "store_all.propertis")
      CHECK=${SHAP}/store_all.propertis
      \cp -fp ${DATA}/store_all.propertis ${DIF}/store_all.propertis > /dev/null 2>&1
      if [[ -e ${DIF}/store_all.propertis ]]; then
        cat ${DIF}/store_all.propertis |tr ':' '\n' | sort -n | sed '/^$/d' > ${SHAP}/store_all.propertis
      else
        echo "-------------------------------------------"
        echo "\"store_all.propertis\" が存在しません。"
        echo "-------------------------------------------"
        return 1
      fi
      ;;
    "store_table.propertis")
      CHECK=${SHAP}/store_table.propertis
      \cp -fp ${DATA}/store_table.propertis ${DIF}/store_table.propertis > /dev/null 2>&1
      if [[ -e ${DIF}/store_table.propertis ]]; then
        cat ${DIF}/store_table.propertis |tr ':' '\n' | sort -n | sed '/^$/d' > ${SHAP}/store_table.propertis
      else
        echo "-------------------------------------------"
        echo "\"store_table.propertis\" が存在しません。"
        echo "-------------------------------------------"
        return 1
      fi
      ;;
    "store_info_XXX.propertis")
      CHECK=${DIF}/store_info*.propertis
      if [[ -s /work/test/TenBan.cfg ]]; then
        while read line; do
          \cp -fp ${DATA}/store_info_${line}.propertis ${DIF}/store_info_${line}.propertis > /dev/null 2>&1
        done < /work/test/TenBan.cfg
      else
        echo "-------------------------------------------"
        echo "対象店舗指定ファイルが設定されていません。"
        echo "-------------------------------------------"
        return 1
      fi
      ;;
    *)
      echo "引数が間違っています。"
      return 1
      ;;
  esac

# 取得結果を表示する。
echo ""
echo "----------------------------------------------------------------------------------------------"
echo "------------------------------------- 取 得 フ ァ イ ル  -------------------------------------"
echo "----------------------------------------------------------------------------------------------"
ls -l $CHECK
echo "----------------------------------------------------------------------------------------------"
echo ""

return 0

}


# /*-------------------------------------------------------------------------*/
# /*差分比較対象取得処理(メイン)                                             */
# /*-------------------------------------------------------------------------*/

# 画面をクリアする。
clear

echo "-変更前($1)-差分比較対象：\"$2\" を取得します。"

# 差分比較用ファイル取得関数の実行
if DiffGet $1 $2 ; then
  echo "\"$2\" $2 の取得が正常終了しました。"
  read -p "【Enter】を押してください...。" END
  exit 0
else
  echo "\"$2\" の取得に失敗しました。"
  read -p "【Enter】を押してください...。" END
  exit 1
fi
```

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

シェルを実行してみる。
取得階層(main) / 取得ファイル(store_all.propertis)の取得
```text:
[root@localhost：/work/test]# ./GetDiff.sh main store_all.propertis
```

```text:
-変更前(main)-差分比較対象："store_all.propertis" を取得します。

----------------------------------------------------------------------------------------------
------------------------------------- 取 得 フ ァ イ ル  -------------------------------------
----------------------------------------------------------------------------------------------
-rw-r--r--. 1 root root 676 10月 19 21:30 /work/test/Def/DIF/main/SHAP/store_all.propertis
----------------------------------------------------------------------------------------------

"store_all.propertis" store_all.propertis の取得が正常終了しました。
【Enter】を押してください...。
```
他のファイル取得時は、こんな感じで表示される。
```text:
-変更前(main)-差分比較対象："store_table.propertis" を取得します。

----------------------------------------------------------------------------------------------
------------------------------------- 取 得 フ ァ イ ル  -------------------------------------
----------------------------------------------------------------------------------------------
-rw-r--r--. 1 root root 783 10月 19 21:30 /work/test/Def/DIF/main/SHAP/store_table.propertis
----------------------------------------------------------------------------------------------

"store_table.propertis" store_table.propertis の取得が正常終了しました。
【Enter】を押してください...。


-変更前(main)-差分比較対象："store_info_XXX.propertis" を取得します。

----------------------------------------------------------------------------------------------
------------------------------------- 取 得 フ ァ イ ル  -------------------------------------
----------------------------------------------------------------------------------------------
-rw-r--r--. 1 root root 90 10月 19 18:00 /work/test/Def/DIF/main/store_info_101.propertis
-rw-r--r--. 1 root root 90 10月 19 18:01 /work/test/Def/DIF/main/store_info_202.propertis
-rw-r--r--. 1 root root 90 10月 19 18:01 /work/test/Def/DIF/main/store_info_303.propertis
----------------------------------------------------------------------------------------------

"store_info_XXX.propertis" store_info_XXX.propertis の取得が正常終了しました。
【Enter】を押してください...。


-変更前(branch)-差分比較対象："store_all.propertis" を取得します。

----------------------------------------------------------------------------------------------
------------------------------------- 取 得 フ ァ イ ル  -------------------------------------
----------------------------------------------------------------------------------------------
-rw-r--r--. 1 root root 676 10月 19 21:31 /work/test/Def/DIF/branch/SHAP/store_all.propertis
----------------------------------------------------------------------------------------------

"store_all.propertis" store_all.propertis の取得が正常終了しました。
【Enter】を押してください...。


-変更前(branch)-差分比較対象："store_table.propertis" を取得します。

----------------------------------------------------------------------------------------------
------------------------------------- 取 得 フ ァ イ ル  -------------------------------------
----------------------------------------------------------------------------------------------
-rw-r--r--. 1 root root 783 10月 19 21:31 /work/test/Def/DIF/branch/SHAP/store_table.propertis
----------------------------------------------------------------------------------------------

"store_table.propertis" store_table.propertis の取得が正常終了しました。
【Enter】を押してください...。


-変更前(branch)-差分比較対象："store_info_XXX.propertis" を取得します。

----------------------------------------------------------------------------------------------
------------------------------------- 取 得 フ ァ イ ル  -------------------------------------
----------------------------------------------------------------------------------------------
-rw-r--r--. 1 root root 90 10月 19 18:00 /work/test/Def/DIF/branch/store_info_101.propertis
-rw-r--r--. 1 root root 90 10月 19 18:01 /work/test/Def/DIF/branch/store_info_202.propertis
-rw-r--r--. 1 root root 90 10月 19 18:01 /work/test/Def/DIF/branch/store_info_303.propertis
----------------------------------------------------------------------------------------------

"store_info_XXX.propertis" store_info_XXX.propertis の取得が正常終了しました。
【Enter】を押してください...。
```
"store_info_XXX.propertis"を取得する際は、対象店番定義ファイルを修正する必要がある。
[【シェルスクリプト②】対象番号をユーザーに入力させるシェルスクリプト](https://qiita.com/ponponpoko/items/bc31af0bf5960fd3d3b3) で作成したシェルを使用

```text:
[root@localhost：/work/test]# ./TenBan.sh
```
```text:
対象店舗番号を入力してください(endを入力すると終了) > 101
対象店舗番号を入力してください(endを入力すると終了) > 202
対象店舗番号を入力してください(endを入力すると終了) > 303
対象店舗番号を入力してください(endを入力すると終了) > end
```
```text:
---対象店舗番号の確認---
101
202
303
----------------------
正しくない場合は、再度実施してください。(Enterで終了)
```
失敗時は、下記の様に出力される。
```text:
-変更前(main)-差分比較対象："store_all.propertis" を取得します。
-------------------------------------------
"store_all.propertis" が存在しません。
-------------------------------------------
"store_all.propertis" の取得に失敗しました。
【Enter】を押してください...。


-変更前(main)-差分比較対象："store_table.propertis" を取得します。
-------------------------------------------
"store_table.propertis" が存在しません。
-------------------------------------------
"store_table.propertis" の取得に失敗しました。
【Enter】を押してください...。


-変更前(main)-差分比較対象："store_info_XXX.propertis" を取得します。
-------------------------------------------
対象店舗指定ファイルが設定されていません。
-------------------------------------------
"store_info_XXX.propertis" の取得に失敗しました。
【Enter】を押してください...。


-変更前(branch)-差分比較対象："store_all.propertis" を取得します。
-------------------------------------------
"store_all.propertis" が存在しません。
-------------------------------------------
"store_all.propertis" の取得に失敗しました。
【Enter】を押してください...。


-変更前(branch)-差分比較対象："store_table.propertis" を取得します。
-------------------------------------------
"store_table.propertis" が存在しません。
-------------------------------------------
"store_table.propertis" の取得に失敗しました。
【Enter】を押してください...。


-変更前(branch)-差分比較対象："store_info_XXX.propertis" を取得します。
-------------------------------------------
対象店舗指定ファイルが設定されていません。
-------------------------------------------
"store_info_XXX.propertis" の取得に失敗しました。
【Enter】を押してください...。
```
# 今回使用したコマンドや構文について
:::note warn
関数名 () { ~ ;}
一定の処理を関数としてまとめる構文

\~~参考リンク~~
[【Linux】シェルスクリプトの関数の使い方！一通りまとめ](https://eng-entrance.com/linux-shellscript-function)
:::
:::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
sed コマンド
ファイルの中の文字列を置換えるコマンド

\~~参考リンク~~
[【 sed 】コマンド（基礎編）――テキストファイルを編集する](https://atmarkit.itmedia.co.jp/ait/articles/1610/06/news021.html)
:::
:::note warn
tr コマンド
テキストファイルの文字を置換する／削除するコマンド
改行コードも置換えれる。

\~~参考リンク~~
[【 tr 】コマンド――テキストファイルの文字を置換する／削除する](https://atmarkit.itmedia.co.jp/ait/articles/1610/03/news017.html)
:::
:::note warn
sort コマンド
テキストファイルを行単位で並べ替えるコマンド

\~~参考リンク~~
[【 sort 】コマンド――テキストファイルを行単位で並べ替える](https://atmarkit.itmedia.co.jp/ait/articles/1611/09/news020.html)
:::
:::note warn
while文
条件が新である限り（偽になるまで）ループ処理を繰り返す。

\~~参考リンク~~
[while 文の使用方法](https://shellscript.sunone.me/while.html)
:::
:::note warn
clear コマンド
画面上をクリアするコマンド

\~~参考リンク~~
[【 clear 】コマンド――端末をクリアする](https://atmarkit.itmedia.co.jp/ait/articles/1903/14/news026.html)
:::
:::note warn
${} ドル波括弧、ドルブレース
変数名の区切りがうまく処理できない場合に使用する。

\~~参考リンク~~
[[シェル] カッコの意味と役割まとめ [Bash, Linux]](https://webbibouroku.com/Blog/Article/shell-paren-brace-bracket#outline__9)
:::
:::note warn
条件式の評価 [[~]]
条件式を評価し、その結果によって終了ステータスを返す。
testコマンドとは若干違う。

\~~参考リンク~~
[シェルスクリプト[[]]のススメ](https://blog.denet.co.jp/post/#if%E6%96%87%E3%81%8A%E4%BE%9B_%E3%81%A8)
:::
:::note warn
test コマンド
ファイルの有無などを判定するコマンド

\~~参考リンク~~
[【 test 】コマンド（基礎編）――ファイルの有無などを判定する](https://blog.denet.co.jp/post/#if%E6%96%87%E3%81%8A%E4%BE%9B_%E3%81%A8)
:::