【シェルスクリプトBash入門①】『シェルスクリプト』とは…？

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

- __『シェルスクリプト』とは…？__
- __代表的な『シェル』について__
- __『シェルスクリプト』の実行方法__

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

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

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

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

## 『シェルスクリプト』とは…？

![shells_script_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255884/4a4ae24d-3905-94ce-5d82-5a5afa6a0d2c.jpeg)

『シェルスクリプト』は・・・

__『シェル』上で実行可能な簡易的（コンパイル不要）なプログラム__で、一言で表すとすれば…

__"実行したいコマンド（Linux）を、上から順番に並べたテキストファイル"__

といった感じで、__定型作業の自動化__などで利用されています。

>類似のモノで言うと、Windowsのバッチファイルに相当します。

__『条件分岐』__や__『繰り返し処理』__などの基本構文も用意されているので、複雑な処理も記述可能です。

*__※『シェル』と『シェルスクリプト』は別物です。（詳しくは下記参照）__*

[【初心者向けにざっくりと】Linuxでよく聞くシェルとは？](https://eng-entrance.com/linux-shell)

## 代表的な『シェル』

UNIX系のOSでは、様々な『シェル』を利用できますが…

現在のデファクトスタンダードは__『bash』__です。

- __Bシェル系__<br>
→&ensp;__sh、ash、bash、zsh__&ensp;etc…
- __Cシェル系__<br>
→&ensp;__csh、tcsh__&ensp;etc…

また・・・

上記のように、C言語のようにスクリプトを記述できる__『csh』__や、『bash』の拡張である__『zsh』__などがあります。

>【余談】
macOSも、以前はデフォルトシェルが『bash』でしたが…
`macOS 10.15 Catalina`では、デフォルトシェルが『bash』から『zsh』に変更されました。

>※デフォルトシェルが『zsh』になるのは`macOS 10.15 Catalina`を新規インストールした場合で、`macOS 10.14 Mojave`以下のmacOSからアップグレードした場合には、__現在使用しているシェル(デフォルトはbash)が維持されるようになっています。__

## 【ハンズオン】簡単なシェルスクリプトの実行

![career-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255884/e683c9b5-6a7e-54ba-4c7d-71c624b798c1.jpeg)

### 実行環境

今回使うシェルは、以下の通りです。

~~~
$ echo $SHELL
/bin/bash
~~~

### シェルスクリプトの作成

~~~
$ vi sample.sh
~~~

以下の２行を、`sample.sh`に記述します。

~~~sample.sh
#!/bin/bash
echo "Hello World!!"
~~~

### シェルスクリプトの実行方法【３つ紹介】

下記の３つの実行方法について、順に解説していきます。

1. &ensp;__shコマンド__
2. &ensp;__.コマンド（ドットコマンド）__
3. &ensp;__実行権限の付与して直接実行__

#### 実行方法①：&ensp;shコマンド

sh（Bourne Shell）を呼び出して（シェルを新しく起動して）、そこでシェルスクリプトを実行する。

~~~
$ sh sample.sh
~~~

#### 実行方法②：&ensp;.コマンド（ドットコマンド）

現在のシェル（カレントシェル）で、シェルスクリプトを実行する。

>※`bash`では、『.コマンド』と全く同じ処理を『sourceコマンド』でも実行できます。

>しかし・・・

>`bash`の基である`sh`では、『.コマンド』しか使用できないので、『sourceコマンド』は使用できません。

~~~
$ . sample.sh
~~~

#### 実行方法③：&ensp;実行権限の付与

実行権限を付与

~~~
$ chmod +x sample.sh
~~~

`sample.sh`を実行

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

>__※カレントディレクトリにあるファイルでも、`./`を付ける必要があります。__
（Linuxでは、マルウェア対策で簡単に実行できないようにしているんだとか…）

>ファイル名のみで実行すると・・・

>おそらく、`コマンドが見つかりません`と表示されるかと思います。

## 【解説】３つの実行方法による違い

![shells_script_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255884/2c30fa87-0f8d-4014-39a2-3d3dd884166a.jpeg)

３つの実行方法による違いは、ざっくり下記の通りです。

1. &ensp;__shコマンド__<br>
→&ensp;別のシェルで実行&ensp;=&ensp;シェル変数は引き継がれない
2. &ensp;__.コマンド（ドットコマンド）__<br>
→&ensp;現在のシェル（カレントシェル）で実行&ensp;=&ensp;シェル変数も引き継がれる
3. &ensp;__実行権限の付与して直接実行__<br>
→&ensp;別のシェルで実行&ensp;=&ensp;シェル変数は引き継がれない

__『.コマンド』__はカレンドシェルで実行されるので、シェル変数も引き継がれますが・・・

__『shコマンド』__及び__『直接実行』__した場合は、別のシェルが起動して実行します。

そのため・・・

__スクリプト終了時に起動されたシェルも消滅するので、シェル変数は引き継がれません。__

### 【ハンズオン】実行結果の比較

シェルスクリプトの準備

~~~sample.sh
#変数作成
num=10
#参照
echo $num
~~~

#### 【結果】 直接実行

~~~
$ ./sample.sh
10
$ echo $num
 ← 何も表示されない（シェル変数が引き継がれない）
~~~

#### 【結果】 .コマンド

~~~
$ . sample.sh
10
$ echo $num
10 ← 10が表示される（シェル変数が引き継がれる）
~~~

このように・・・

`直接実行した場合`と`.コマンド`で実行した場合で、スクリプト終了時にシェル変数の状態が異なります。

##まとめ・感想

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

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

今後は、より実践的な内容として…

__『繰り返し処理』__や__『条件分岐』__

などの基本文法についてまとめる予定。

__--- ＜次の内容＞ ---__
[【シェルスクリプトBash入門②】 基本文法](https://qiita.com/yaaabu51/items/71487969dcf321ddc88b)