このページではシェルスクリプトに関する基本的なことを紹介します。 また、以降のページで順次シェルスクリプトの詳細を紹介していきます。
通常コンソールで操作するようなコマンドを実行したい順に記述したテキストファイルです。 テキストファイルに処理を順に記述しておくことで一括で実行することが出来ます。このようなテキストファイルをShellスクリプトと呼びます。
シェルスクリプトを構成するテキストファイルには決まったフォーマットというかお作法があります。 以下が基本のフォーマットです。
#!/bin/bash
(処理の記述)
exit 0
先頭行はこのスクリプトがbashで実行されることを宣言しています。最終行のexitは明示的にスクリプトが完了したことを表しています。
「処理の記述」部分にOSに指示したい内容を書いていくことでシェルプログラミングができます。 もっとも簡単なスクリプトは、以下のように、ただ実行したいコマンドを順に書いただけのものです。
#!/bin/bash
echo "hello world"
echo "bye world"
exit 0
たとえば、上記のechoの部分を以下のように変更するだけで、簡単なバックアップスクリプトが作れます。
こういった一連の処理をまとめてシェルスクリプトにしておくだけで、シェルスクリプト一つ起動するだけで面倒な作業を完了したり、オペレーションミスを減らしたり、といった効果が生まれます。日ごろからよく行う作業などはシェルスクリプト化しておくというのはサーバ運用の基本になります。
シェルや多くのLinuxコマンドではリターンコード(戻り値)を返します。 全ての処理が正常に終わった場合は、"exit 0"で終了するのが作法です。 途中の処理が失敗している場合は"exit 1"などで終了しておくことで、スクリプトでエラーが発生していることを利用者に伝えることができます。ここでいう0や1はリターンコードと呼ばれます。
#!/bin/bash
(処理の記述)
exit 0
コマンドの実行結果が成功した場合は0、失敗した場合は0以外(通常は1)を返すのが習慣です。直前のコマンドが成功/失敗を表すリターンコードは$?という変数に格納されています。
$ mkdir test
$ echo $?
0
$ mkdir test
mkdir: ディレクトリ `test' を作成できません: ファイルが存在します
$ echo $?
1
シェルスクリプトのファイル名に特にルールはありませんが、慣習的にxxx.shのように拡張子を.shにして、シェルスクリプトであることを明示することが多いです。
シェルスクリプトのファイルには実行するユーザに対する実行権限が必要です。
シェルスクリプトには引数を渡すことができます。 シェルスクリプト内では引数は$1、$2...といった特殊な変数に格納されています。
シェルスクリプトでは、処理中の値を変数に保存しておくことができます。単に処理が簡単になるだけでなく、適切な名前の変数を定義することでスクリプト自体の可読性も高まります。マジックナンバーを避け、適切な変数を使用するべきです。
繰り返し記述するような処理は関数化するべきです。リファクタリングはシェルスクリプトでも有効です。
if文やwhile文といった制御構文を利用することでより複雑な処理を記述することが出来ます。その他、ループなどを抜けるbreakや次のループに移動するcontinueなどについても紹介します。