この記事は、Linuxについて勉強している初心者の方向けに「Shellスクリプト」について解説します。最後まで読んで頂けましたら、Shellスクリプトはどのような役割を担っているのか?を理解出来るようになっているでしょう。
なので、是非最後まで読んで下さいね。
シェルスクリプトの基本事項
「シェルスクリプト」とは、カーネルに対して処理をさせたい命令をまとめた「プログラム」ファイルのことです。「Shell」はシェルスクリプトの上から順番に処理していきますので、サーバー管理のような単純な作業をまとめておくと自動化することができます。

シェルスクリプトで記述されたコマンドは、すべて終了ステータスを持ち、終了時の真偽によってその後の条件を判断します。
シェルスクリプトを記述するには、始めの1列目に「#!」から始まる「シェバン」「シバン」といわれる記述をしなければいけません。
#!/bin/sh 👈 shはBシェルを指しています
command ●●● 👈 2行目から、シェルスクリプトを記述します。
ココがポイント
シェバンは、必ずシェルスクリプトの第1行目に書きます。シェルスクリプトの頭に「#!」という文字列があると、それに続くコマンド(ここでは/bin/sh)が動作します。
つまり、シェルスクリプトを実行するときに使用するシェルを指定するということです。
ちなみにKシェルを動かす場合なら「#!/bin/ksh」と記述します。同様に2行目からはスクリプト(コマンド)を羅列していきます。
コメントの付け方「#」
シェルスクリプトを書いていると、あとで読み返しているときに、コードが何の処理をしているのが分からなくなってしまうことがよくあります。そのため、読み返したときにコードの説明をコメントアウトしておくことが大切です。
# 「#」で始まるこの行は、コメントとして解釈され実行対象にはなりません。
comand・・・
シェルスクリプトにコメントを書く場合、「#」を入力してからコメントを書いていきます。注意点として、「”」や「’」で囲んでいると文字列として扱われてしまいますから覚えておきましょう。
アドバイス
シェルスクリプトを記述するための書式をあらかじめ「ひな形(テンプレート)」化しておくことをお勧めします。また、シェルスクリプトは、改行位置やインデントなどを、かなり自由に書き込めます。特にこだわりがない場合は、インデント幅は空白2文字をお勧めします。
権限の設定
シェルスクリプトを書き終わったら、実行する前に権限の設定が必要になります。
下記のコマンドを入力して実行すると権限の設定は完了です。
chmod 755 <スクリプトファイル名>.sh
シェルスクリプトの実行
シェルスクリプトには、コマンドとして実行する以外に、「sh」の引数に指定して実行する方法など、いくつかの実行方法があります。
最もオーソドックスな実行方法は、「sh」の引数に実行したいシェルスクリプトを指定して実行する方法です。
$ sh <スクリプトファイル名>.sh
ココに注意
シェルスクリプトを実行させるためには、実行コマンドへ
「sh /<パス(所在)>/<シェルスクリプト名>」と入力します。
シェルスクリプト名だけを指定しても、シェルスクリプトの所在が分からないと実行エラーを起こします。
コマンドの終了ステータス
シェルスクリプトは、実行終了時にステータスコード(リターンコード)を返却します。
終了ステータス | 真偽値 |
0 | 真(true) |
0以外 | 偽(false) |
シェルスクリプトでは、各コマンドの終了ステータスが「0」なら「真(true)」、「0以外」なら「偽(false)」として扱われます。主な使用用途は、if文、while分、&&、||の条件判定に利用されます。
終了ステータスは、コマンドの実行直後に特殊パラメータ「$?」を参照することによって得ることが出来ます。また、シェルスクリプトの終了ステータスは、「exit」コマンドによって返却されます。
試しに「true」コマンド、「false」コマンドを使用して、確認してみましょう。
# trueコマンドの実行
$ true
$ echo $?
# falseコマンドの実行
$ false
$ echo $?
コンソールへ直接手入力して、終了ステータスコードを確認します。
1 2 3 4 5 6 |
[root@CentOS7 ~]# true [root@CentOS7 ~]# echo $? 0 [root@CentOS7 ~]# false [root@CentOS7 ~]# echo $? 1 |
trueやfalseコマンドの直後に特殊パラメータ$?を参照すると、それぞれ「0」や「1」の値が表示されることがわかります。
ひな形の活用
プログラム全般に言えることですが、人って「あるモノから間違いを見つける」のは得意ですが、「足りないものを見つける」のは苦手な生き物です。1~10まで作成時に考えるよりも、予め必要箇所をテンプレート化しておくだけで格段に労力が下がります。
そこでシェルスクリプトを作成する上で「ひな形(テンプレート)」を活用しましょう。予め、シェルスクリプトのひな型を用意しておくことで、「可読性」や「保守性」を高めるメリットがあります。
シェルスクリプトの作成には、下記のひな型を丸ごとコピーして、コンソールに貼り付けます。該当する箇所へシェルスクリプトを埋め込んでから、名前をつけて保存するだけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
#!/bin/sh #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ # # ver.1.0.0 yyyy.mm.dd # # Usage: # # sh <BASE_DIR>/template.sh # # Description: # 実行スクリプトテンプレート # # 設計書 # なし # #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ # ---------------------------------------------------------- # variables (変数の宣言領域) # ---------------------------------------------------------- scope="var" rc=2 # ---------------------------------------------------------- # functions (関数を記述する領域) # ---------------------------------------------------------- scope="func" # -------------------------------------------------- # devider. # -------------------------------------------------- # return N/A # -------------------------------------------------- line (){ echo -e "\\n ------------" echo -e " ▼ ${1}" } # ---------------------------------------------------------- # pre-process (事前処理ロジックを記述する領域) # ---------------------------------------------------------- scope="pre" # ---------------------------------------------------------- # main-process (メインロジックを記述する領域) # ---------------------------------------------------------- scope="main" if [ $? -eq 0 ]; then rc=0 fi # ---------------------------------------------------------- # post-process (事後処理ロジックを記述する領域) # ---------------------------------------------------------- scope="post" exit $rc |
※ ファイルを編集する場合、LinuxなどのUNIX系OSでは、テキストファイルの改行コードは標準でLFのみになるため、とくに気にする必要はありませんが、Windowsでテキストファイルを編集する場合、標準の改行コードがCR+LFになってしまうため、注意してください。
Shellスクリプト基礎知識(全11記事+1)
├─シェルスクリプトの基本事項!
├─変数と特殊変数について!
├─演算子「算術演算子」「比較演算子」について!
├─条件分岐「if」「case」について!
├─ループ処理「for」「while」について!
├─文字列置換「bash」「sed」について!
├─複数行のテキスト出力!ヒアドキュメントについて!
├─書式?戻り値?シェルスクリプト内の関数について!
├─シェルの組み込みコマンドについて!
├─クォートとは?コマンド置換とは?実現方法と内容の違いについて!
└─リダイレクトとは?標準入力・出力、標準エラー出力等について!
(補足)シェルスクリプトの設計書とは?必要な項目や書き方等を解説!