この記事では、《シェル や シェルスクリプト》について、
僕が学習した内容をまとめています。
- 『シェルスクリプト』とは…?
- 代表的な『シェル』について
- 『シェルスクリプト』の実行方法
こういった内容についてまとめています。
※本記事は、自分で学習したことのまとめ用として書いています。
尚、解説で誤った点があれば、スローして頂ければ喜んでキャッチしますのでお願い致します。
『シェルスクリプト』とは…?
『シェルスクリプト』は・・・
『シェル』上で実行可能な簡易的(コンパイル不要)なプログラムで、一言で表すとすれば…
"実行したいコマンド(Linux)を、上から順番に並べたテキストファイル"
といった感じで、定型作業の自動化などで利用されています。
類似のモノで言うと、Windowsのバッチファイルに相当します。
『条件分岐』や『繰り返し処理』などの基本構文も用意されているので、複雑な処理も記述可能です。
※『シェル』と『シェルスクリプト』は別物です。(詳しくは下記参照)
代表的な『シェル』
UNIX系のOSでは、様々な『シェル』を利用できますが…
現在のデファクトスタンダードは『bash』です。
- Bシェル系
→ sh、ash、bash、zsh etc… - Cシェル系
→ csh、tcsh etc…
また・・・
上記のように、C言語のようにスクリプトを記述できる『csh』や、『bash』の拡張である『zsh』などがあります。
【余談】
macOSも、以前はデフォルトシェルが『bash』でしたが…macOS 10.15 Catalina
では、デフォルトシェルが『bash』から『zsh』に変更されました。※デフォルトシェルが『zsh』になるのは
macOS 10.15 Catalina
を新規インストールした場合で、macOS 10.14 Mojave
以下のmacOSからアップグレードした場合には、現在使用しているシェル(デフォルトはbash)が維持されるようになっています。
【ハンズオン】簡単なシェルスクリプトの実行
実行環境
今回使うシェルは、以下の通りです。
$ echo $SHELL
/bin/bash
シェルスクリプトの作成
$ vi sample.sh
以下の2行を、sample.sh
に記述します。
#!/bin/bashecho"Hello World!!"
シェルスクリプトの実行方法【3つ紹介】
下記の3つの実行方法について、順に解説していきます。
- shコマンド
- .コマンド(ドットコマンド)
- 実行権限の付与して直接実行
実行方法①: shコマンド
sh(Bourne Shell)を呼び出して(シェルを新しく起動して)、そこでシェルスクリプトを実行する。
$ sh sample.sh
実行方法②: .コマンド(ドットコマンド)
現在のシェル(カレントシェル)で、シェルスクリプトを実行する。
※
bash
では、『.コマンド』と全く同じ処理を『sourceコマンド』でも実行できます。しかし・・・
bash
の基であるsh
では、『.コマンド』しか使用できないので、『sourceコマンド』は使用できません。
$ . sample.sh
実行方法③: 実行権限の付与
実行権限を付与
$ chmod +x sample.sh
sample.sh
を実行
$ ./sample.sh
Hello World!!
※カレントディレクトリにあるファイルでも、
./
を付ける必要があります。
(Linuxでは、マルウェア対策で簡単に実行できないようにしているんだとか…)ファイル名のみで実行すると・・・
おそらく、
コマンドが見つかりません
と表示されるかと思います。
【解説】3つの実行方法による違い
3つの実行方法による違いは、ざっくり下記の通りです。
- shコマンド
→ 別のシェルで実行 = シェル変数は引き継がれない - .コマンド(ドットコマンド)
→ 現在のシェル(カレントシェル)で実行 = シェル変数も引き継がれる - 実行権限の付与して直接実行
→ 別のシェルで実行 = シェル変数は引き継がれない
『.コマンド』はカレンドシェルで実行されるので、シェル変数も引き継がれますが・・・
『shコマンド』及び『直接実行』した場合は、別のシェルが起動して実行します。
そのため・・・
スクリプト終了時に起動されたシェルも消滅するので、シェル変数は引き継がれません。
【ハンズオン】実行結果の比較
シェルスクリプトの準備
#変数作成num=10
#参照echo$num
【結果】 直接実行
$ ./sample.sh
10
$ echo $num
← 何も表示されない(シェル変数が引き継がれない)
【結果】 .コマンド
$ . sample.sh
10
$ echo $num
10 ← 10が表示される(シェル変数が引き継がれる)
このように・・・
直接実行した場合
と.コマンド
で実行した場合で、スクリプト終了時にシェル変数の状態が異なります。
まとめ・感想
これからしばらく『シェルスクリプト』を書きそうなので、しっかり基礎を理解していきたい。
今後は、より実践的な内容として…
『繰り返し処理』や『条件分岐』
などの基本文法についてまとめる予定。