【シェルスクリプトBash入門②】 基本文法

>この記事では、《シェルスクリプトの基本文法》について、
業務を通して学習した内容をまとめています。

- __『変数』の使い方__
- __『条件分岐』と『繰り返し処理』の使い方__
- __『関数』の使い方__

こういった内容についてまとめています。

__※本記事は、自分で学習したことのまとめ用として書いています。
尚、解説で誤った点があれば、スローして頂ければ喜んでキャッチしますのでお願い致します。__

__--- 【シェルスクリプト入門】 ---__

- [【シェルスクリプトBash入門①】『シェルスクリプト』とは…？](https://qiita.com/yaaabu51/items/27773e620a65c5821aaf)
- [【シェルスクリプトBash入門②】 基本文法](https://qiita.com/yaaabu51/items/71487969dcf321ddc88b)

## 変数（文字列）

### ①：&ensp;変数の代入

#### --- 例題 ---

~~~sample.sh
#!/bin/bash

val="Hello World!!" 
~~~

__*※`=`の両端に半角スペースを入れないよう注意*__

### ②：&ensp;変数の展開

#### --- 例題 ---

~~~sample.sh
#!/bin/bash

val="Hello World!!" 

echo "${val}"
~~~

__*※`""`だけでは変数展開されないので注意*__

#### --- 実行結果 ---

~~~
$ . sample.sh
Hello World!!
~~~

## 変数（数値）

### ①：&ensp;変数の代入

#### --- 例題 ---

~~~sample.sh
#!/bin/bash

x=10

echo $x
echo $x+1
~~~

__*※`=`の両端に半角スペースを入れないよう注意*__

#### --- 実行結果 ---

~~~
$ . sample.sh
10
10+1
~~~

__*※計算されていないことに注意*__

計算するには…

~~~sample.sh
#!/bin/bash

x=10

echo $x
echo $x+1
echo `expr $x + 1`
~~~

上記のように・・・

『計算結果』や『コマンドの出力結果』を変数に設定した場合は…

__`expr`__と__``（バッククォート）__を使用する。

__*※半角スペースを忘れないよう注意*__

#### --- 実行結果 ---

~~~
$ . sample.sh
10
10+1
11
~~~

## 四則演算

#### --- 例題 ---

~~~sample.sh
#!/bin/bash

x=10

echo `expr $x + 1`  # 足し算
echo `expr $x - 1`  # 引き算
echo `expr $x \* 2` # 掛け算
echo `expr $x / 2`  # 割り算
~~~

#### --- 実行結果 ---

~~~
$ . sample.sh
11
9
20
5
~~~

## 条件分岐｜if文、for文

1. &ensp;__if文__
2. &ensp;__case文__

### 条件分岐①：&ensp;if文

#### --- 例題 ---

~~~sample.sh
#!/bin/sh

str="hello"

if [ ${str} = "hello" ]; then
    echo "${str}"
    echo "Hello!!!"
elif [ ${str} = "world" ]; then
    echo "${str}"
    echo "World!!!"
else
    echo "Hello World!!!"
fi
~~~

- if文は`[]`内に条件を入れ、`then`をつける
- 複数の条件を扱うときは`elif`でつなぎ、if同様`then`をつける
- `else`の後は何も書かず、条件分岐の終わりは`fi`で閉じる

#### --- 実行結果 ---

~~~
$ . sample.sh
hello
Hello!!!
~~~

>↓ if文のオプショについて詳しく知りたい方は、下記を参照してみて下さい。

>[》【シェルスクリプトBash】 if 文（test文）のオプションまとめ](https://qiita.com/yaaabu51/items/8758447fa672288f4757)

### 【おまけ】&ensp;シェルスクリプト内で実行したコマンドが正常終了したかを判定

#### --- 例題 ---

~~~sample.sh
#!/bin/bash

. dummy.sh  # dummy.shを実行

exit_flag=$? # 実行結果を変数に格納

if [ $exit_flag = 0 ]; then
    echo $exit_flag
    echo "dummy.shは正常終了"
else
    echo $exit_flag
    echo "dummy.shは異常終了"
fi
~~~

コマンド実行後に`$?`によって、直前に実行したコマンドのステータスコードが取得できる。

- __成功（正常終了）: 0__
- __失敗（異常終了）: 0以外全て(1 〜 255)__

#### --- 実行結果（正常終了）  ---

~~~
$ . sample.sh
0
dummy.shは正常終了
~~~

### 条件分岐②：&ensp;case文

#### --- 例題 ---

~~~sample.sh
#!/bin/sh

str="hello"

case ${str} in
    "hello") echo "Hello" ;;
    "world") echo "World" ;;
    *) echo "hello World!!" ;;
esac
~~~

- caseの後に判定したい変数などを指定し、その後に`条件)`といった形で記述する
- `*)`は多くのプログラミング言語におけるswitch~case文の`default`に該当する
- 末尾に`;;`を付ける

#### --- 実行結果 ---

~~~
$ . sample.sh
Hello
~~~

## 繰り返し処理（ループ）｜for文、while文

1. &ensp;__for文__
2. &ensp;__while文__

### 繰り返し処理①：&ensp;for文

#### --- 例題①：&ensp;複数の文字列 ---

~~~sample.sh
#!/bin/sh

for str in hello world aaa
do
    echo "${str}"
done
~~~

#### --- 実行結果 ---

~~~
$ . sample.sh
hello
world
aaa
~~~

#### --- 例題②：&ensp;配列 ---

~~~sample.sh
#!/bin/sh

array=(1 2 3 4 5)

for i in ${array[@]}
do
    echo $i
done
~~~

#### --- 実行結果 ---

~~~
$ . sample.sh
1
2
3
4
5
~~~

#### --- 例題③：&ensp;seq ---

`seq 第一引数 第二引数`と記述することで・・・

第一引数以上〜第二引数以下の整数を順番にループしてくれる。

>for文を使うなら、`seqコマンド`は覚えておきたい

~~~sample.sh
#!/bin/sh

for i in `seq 1 5`
do
    echo $i
done
~~~~

#### --- 実行結果 ---

~~~
$ . sample.sh
1
2
3
4
5
~~~

### 繰り返し処理②：&ensp;while文

#### --- 例題 ---

~~~sample.sh
#!/bin/sh

i=0
while [ $i -lt 10 ]
do
    echo $i
    i=`expr $i + 1 `
done
~~~
|オプション|説明|
|:--|:--|
| num1 -lt num2 |__num1 が num2 より小さい__なら__真__|


#### --- 実行結果 ---

~~~
$ . sample.sh
0
1
2
3
4
5
6
7
8
9
~~~

## 関数&ensp;【３パターン】

1. &ensp;__基本系__
2. &ensp;__function省略系__
3. &ensp;__引数を渡す__

### パターン①：&ensp;基本系

#### --- 例題 ---

~~~sample.sh
#!/bin/bash

function hello() {
    echo "hello"
}

hello # 関数呼び出し
~~~

#### --- 実行結果 ---

~~~
$ ./sample.sh
hello
~~~

### パターン②：&ensp;function省略系

#### --- 例題 ---

~~~sample.sh
#!/bin/bash

hello() {
    echo "hello"
}

hello # 関数呼び出し
~~~

#### --- 実行結果 ---

~~~
$ . sample.sh
hello
~~~

### パターン③：&ensp;引数を渡す

#### --- 例題 ---

~~~sample.sh
#!/bin/bash

hello() {
    echo "hello $1 and $2"
}

hello John Alex # 関数呼び出し
~~~

#### --- 実行結果 ---

~~~
$ . sample.sh
hello John and Alex↲
~~~

## 【おまけ】&ensp;現在の日付・時刻を取得する

今日の日付と現在の時刻が、`2020年 3月4日 22時00分00秒`だった場合

#### --- 例題 ---

~~~sample.sh
#!/bin/bash

today1=`date "+%Y%m%d%H%M%S"`
today2=`date "+%Y_%m%d_%H%M%S"`

echo "$today1"
echo "$today2"
~~~

#### --- 実行結果 ---

~~~
$ . sample.sh
20200305215333
2020_0305_215333
~~~

## まとめ・感想

![surfing-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255884/2218daee-da1d-1b3c-3282-a612d24fe7b3.jpeg)

これからしばらく『シェルスクリプト』を書きそうなので、しっかり基礎を理解していきたい。

今後は…

__if文（test文）のオプション__

をまとめる予定。