【シェルスクリプト②】対象番号をユーザーに入力させるシェルスクリプト

# なぜこのシェルスクリプトを・・・？
対象モジュールの名前には店舗番号が含まれており、その店舗番号を基に対象モジュールを選別する必要があったため、作成しました。

例えば、こういった感じのモジュール
 store_info_[店舗番号].propertis　-->　store_info_123.propertis

動きとしては下記です。
① ユーザーに対象店舗番号を入力させる。
② ユーザーにより"end"が入力されたら終了。
③ 入力された値を表示する。

このシェル内で作成した店舗情報ファイルを基に、対象モジュールを選定して差分比較などを行う。

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

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

# 画面クリア
clear

# check(変数)の初期値設定
check=""

# 対象店舗番号の入力ファイル作成/初期化(空) 
: > /work/test/TenBan.cfg

# ループ処理(While文) check(変数)に"end"が入力されるまで繰り返す
while [[ $check != "end" ]];do

# ユーザーに入力を求める
  read -p "対象店舗番号を入力してください(endを入力すると終了) > " TENBAN

# 条件分岐(if文) TENBAN(変数)の値で分岐
  if [[ $TENBAN != "end" ]];then

# TENBAN(変数)の値が"end"以外ならば、TENBAN(変数)の値を"TenBan.cfg"に追加出力
   echo $TENBAN >> /work/test/TenBan.cfg

# TENBAN(変数)の値が"end"ならば、check(変数)に"end"を入力
  else
   check=end

# 入力後、画面クリア
   clear

# "TenBan.cfg"の空白行を削除し、"tmp.txt"に出力
   sed '/^$/d' /work/test/TenBan.cfg > /work/test/tmp.txt

# "tmp.txt"を"TenBan.cfg"に出力
# sedコマンドの変換対象ファイルに対して、変換後に同じ対象ファイルへ出力できない為、この処理がある
   cat /work/test/tmp.txt > /work/test/TenBan.cfg

# "tmp.txt"を削除
   rm -f /work/test/tmp.txt

# 対象店舗番号の確認
   echo "---対象店舗番号の確認---"
   cat /work/test/TenBan.cfg
   echo "----------------------"

# ユーザーに打鍵させて、処理を終了させる
   read -p "正しくない場合は、再度実施してください。(Enterで終了)" END
  fi
done

# 画面クリア
clear

```

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

```
[root@localhost：/work/test]# ./TenBan.sh
```
```
対象店舗番号を入力してください(endを入力すると終了) > 
```
試しに "101" と "202" を入力してみる。
```
対象店舗番号を入力してください(endを入力すると終了) > 101
対象店舗番号を入力してください(endを入力すると終了) > 202
対象店舗番号を入力してください(endを入力すると終了) > 
```
入力後の "TenBan.cfg” ファイルの中の状態
```text:TenBan.cfg
101
202
```
今度は、"空白" や "前後にスペース" を入れた状態で入力してみる。
<font color="Red">※ マーカーしてみると空白が入っていることが分かります。</font>

```
対象店舗番号を入力してください(endを入力すると終了) > 101
対象店舗番号を入力してください(endを入力すると終了) > 202
対象店舗番号を入力してください(endを入力すると終了) > 
対象店舗番号を入力してください(endを入力すると終了) >  303
対象店舗番号を入力してください(endを入力すると終了) >    404   
```
入力後の "TenBan.cfg” ファイルの中の状態
<font color="Red">※ 前後のスペースが入っていないことが分かる。</font>
```text:TenBan.cfg
101
202

303
404
```
今度は、"end" を入力してみる。
```text:打鍵前
対象店舗番号を入力してください(endを入力すると終了) > 101
対象店舗番号を入力してください(endを入力すると終了) > 202
対象店舗番号を入力してください(endを入力すると終了) > 
対象店舗番号を入力してください(endを入力すると終了) >  303
対象店舗番号を入力してください(endを入力すると終了) >  404   
対象店舗番号を入力してください(endを入力すると終了) > end
```
<font color="Red">※ 空白行が消えているのが分かる。</font>
```text:打鍵後
---対象店舗番号の確認---
101
202
303
404
----------------------
正しくない場合は、再度実施してください。(Enterで終了)
```
この時の "TenBan.cfg” ファイルの中の状態
<font color="Red">※ こちらも空白行が消えているのが分かる。</font>
```text:TenBan.cfg
101
202
303
404
```
これで無駄なスペースや空白行を除外することができ、"TenBan.cfg" ファイルを使用する際、スペースや空白行によるエラーが起こらなくなる。

# 今回使用したコマンドや構文について
:::note warn
clear コマンド
画面上をクリアするコマンド

\~~参考リンク~~
[【 clear 】コマンド――端末をクリアする](https://atmarkit.itmedia.co.jp/ait/articles/1903/14/news026.html)
:::

:::note warn
: コマンド
:（コロン）コマンドは、何もしないで単に[0]の終了ステータスを返すコマンド
while文(ループ)の時や、ファイルサイズ０サイズのファイルを作成する時などに使える。

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

:::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
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
sed コマンド
ファイルの中の文字列を置換えるコマンド

\~~参考リンク~~
[【 sed 】コマンド（基礎編）――テキストファイルを編集する](https://atmarkit.itmedia.co.jp/ait/articles/1610/06/news021.html)
:::