例えば、Linuxサーバ上に試験環境を構築して試験を行うときに、
試験前の設定やログファイルの収集のように
複数のコマンドを毎回手作業で実行するのを面倒に感じることがあると思います。
それらを毎回、手作業で実行していると、単に作業時間がかかるだけでなく、
コマンドの入力ミスによる誤操作の要因にもなります。
そこで便利なのがシェルスクリプトです。
シェルスクリプトを使うことで、
複数のコマンドを一つのファイルにまとめて実行できるようになります。

本記事では、シェルスクリプトの基本的な書き方と実行方法を解説します。
シェルスクリプトとは
シェルスクリプトとは、Linuxで実行する複数のコマンドをファイルにまとめ、
シェルスクリプト内にまとめたコマンドを自動的に実行できるようにしたファイルです。
毎回、定型で実行する複数のコマンドがあるときに、
シェルスクリプトにまとめることで、スクリプトを一回実行するだけでよくなります。
それにより、コマンド入力ミスによる誤操作の防止や作業時間を短縮することができるため、
システム開発業務でも試験時の各種設定やログ収集など、多くの場面で使われます。
シェルスクリプトの作成方法
まずは、viなどのテキストエディタでシェルスクリプト用のファイルを作成します。
viの使い方に自信のない方は、次の記事も併せて参考にしてみてください。
【Linux】viコマンドの基本操作まとめ|初心者向け解説
ファイル名はtest.shのように、拡張子として .sh を付けることが多いです。
シェルスクリプトの基本的な書き方
シバンを記述する
シェルスクリプトの先頭には、一般的にシバン(Shebang)を記述します。
#!/bin/bash#! から始まるこの1行は、「このスクリプトをどのプログラムで実行するか」の指定であり、
上記は、Bashを使ってスクリプトを実行することを意味します。
Linux環境ではBashが利用されることが多いため、
まずは、おまじないレベルでこの書き方を覚えておけば問題ありません。
コマンドを書く
シバンを記述したあと、その下に実行したいコマンドを順番に記述します。
echo "Hello Linux"
pwd
ls -lこのように記述した場合、以下のとおり上に記述したコマンドから順番に実行されます。
- 「Hello Linux」と文字を出力
- 現在のディレクトリパスを表示する
- ディレクトリ内にあるファイルやディレクトリの一覧を表示
変数
多くのプログラミング言語と同じように、
シェルスクリプトでも値を変数で保存することができます。
使用できる変数はシェル変数と環境変数の2種類があり、用途に応じて使い分けます。
シェル変数
シェル変数は、変数を宣言したシェルスクリプトの中でのみ使用できる変数です。
TEST_PATH=/home/dbg/test上記の場合、変数TEST_PATHに/home/dbg/testを値として格納しています。
変数に設定した値は、次のように使用することができます。
ls -l ${TEST_PATH}このように実行した場合、ls -l /home/dbg/testと同義となるため、
/home/dbg/test内にあるファイルやディレクトリの一覧が表示されます。
シェルスクリプト内で同じ値を何度も使用するときに、
それらを変数として管理することで、
あとから値を変更する必要が発生した場合に修正が楽になります。
単純なシェルスクリプトな場合、シェル変数だけで十分に対応できます。
環境変数
環境変数は、自身のシェルスクリプトおよび、
そのシェルスクリプトで起動するすべてのシェルスクリプトで使用できる変数です。
export TARGET_PATH=/home/dbg/test/log環境変数はシェルスクリプトを起動するLinux環境にあらかじめ設定されたもののほか、
上記のように必要に応じて設定することもできます。
自身のシェルスクリプトで起動したシェルスクリプトの処理を実行する際に、
それらのシェルスクリプトでも同じ値を参照するために使用します。
使用方法はシェル変数と同じく、${TARGET_PATH}のように記述します。
条件分岐
何らかの条件によって実行する処理を変えたい場合は、if文を使います。
if [ -f sample.txt ]; then
echo "ファイルがあります"
fi上記は、sample.txtという名前のファイルがある場合にのみ、
「ファイルがあります」とメッセージを表示するシェルスクリプトです。
各行の意味は次のとおりです。
- if:if文(条件分岐)の開始
- []:条件式
- then:条件が真(成立)の場合に実行する処理の開始
- -f:条件を判定する際に用いるオプション(※詳細は後述)
- sample.txt:判定対象
- fi:if文(条件分岐)の終了
条件の判定に使用するオプションは、次のようなものがあります。
| 条件 | 意味 |
|---|---|
-f file | ファイルである |
-d dir | ディレクトリである |
-e path | ファイルまたはディレクトリが存在する |
また、次のように判定はオプションを使用せず、値どうしで比較することもできます。
if [ "$COUNT" -eq 5 ]; then
echo "5です"
fi条件分岐を書く際に使用する比較演算子は次のとおりです。
| 条件 | 意味 |
|---|---|
= | 等しい(文字列) |
!= | 等しくない(文字列) |
-eq | 等しい(数値) |
-ne | 等しくない(数値) |
-gt | より大きい |
-ge | 以上 |
-lt | より小さい |
-le | 以下 |
最後にですが、条件分岐は次のように複数に分岐することもできます。
if [ 条件1 ]; then
処理1
elif [ 条件2 ]; then
処理2
else
処理3
fi上記は、条件1が偽(未成立)かつ条件2が真(成立)の場合に処理2を実行します。
また、どの条件にも当てはまらない場合はelseに書かれた処理を実行します。elifについては複数書くこともできます。

システム開発の業務でもログ収集用のシェルスクリプトを作成する際に、
ファイルやディレクトリが存在するかをチェックする目的でよく使用します。
繰り返し処理
同じ処理を複数回実行したい場合に使用します。
繰り返し処理に使う構文は次の3つがあります。
for文
for文は、指定した値や対象を順番に処理します。
for i in {0..5}
do
処理
doneこの場合、{0..5}は0から5までの値に展開され、それぞれの値を順番に変数iへ代入して処理します。
また、次のように書くことで、特定のファイルも順番に処理できます。
for file in *.log
do
echo "$file"
done上記は、現在のディレクトリにある
「.log で終わるファイルすべての名前」を表示するシェルスクリプトです。
各行の意味は次のとおりです。
- for:for文の開始
- file:現在処理しているファイル名を格納する変数
(変数名はnameやitemなど任意に設定できます) - in:後ろに指定した対象を順番に取り出します
- *.log:現在のディレクトリにある .logで終わるファイルすべてを対象とします
- do:繰り返し実行する処理の開始
- done:for文の終了
繰り返し処理を途中で終了したい場合は、breakを使用します。
for file in *.log
do
echo "$file"
if [条件]; then
break
fi
done上記の場合、分岐処理の条件が真となった場合に、
繰り返し処理が途中であってもfor文を終了し、次の処理に進みます。

ログ収集用シェルスクリプトで複数のログを収集したいときなど、
複数のファイルを対象に処理を実行する場合にfor文を使用します。
while文
while文は、指定した条件の判定結果が真の間、処理を繰り返します。
while [ 条件 ]
do
処理
done条件は、条件分岐(if文)で紹介した内容をもとに指定します。
このとき、誤って偽にならない条件を指定した場合、
while文から抜けられないため、無限ループとなり処理が終わらなくなります。
until文
until文は、while文とは逆で指定した条件の判定結果が真になるまで処理を繰り返します。
until [ 条件 ]
do
処理
done条件は、条件分岐(if文)で紹介した内容をもとに指定します。
while文とは逆に、誤って真にならない条件を指定した場合、
while文から抜けられないため、無限ループとなり処理が終わらなくなります。
シェルスクリプトの実行方法
実行権限を付与する
Linuxでは、ファイルごとにアクセス権限(パーミッション)が設定されています。
作成したシェルスクリプトを実行するためには、
chmodコマンドで実行権限(x)を付与する必要があります。
chmodコマンドの使い方がわからない方は、
次の記事で紹介しているので参考にしてみてください。
【Linux初心者向け】よく使う基本コマンド一覧|最初に覚えたい操作まとめ:chmod
シェルスクリプトを実行する
実行権限を付与したら、次のように実行します。
$ ./test.sh正常に実行されると、
シェルスクリプトに記述した処理に沿ってコマンドが順番に実行されます。
また、実行権限を付与していない場合でも、
次のようにBashを指定して実行することができます。
$ bash test.shこの方法でもシェルスクリプトを実行することはできますが、
筆者が見てきた限りでは、実務では前述の./test.shで実行することが多いです。
まとめ
シェルスクリプトを利用することで、
複数のLinuxコマンドをまとめて実行できるようになります。
多くのコマンドを実行するような定型作業がある場合、
シェルスクリプトを使うことで効率よく作業ができるようになります。

筆者も、主に試験関連の作業を対応するときに
試験前の設定やログ収集などでシェルスクリプトを活用しています。
まずは、echoのように影響の少ないコマンドで試すことからはじめ、
慣れてきたら条件分岐や繰り返し処理など、
複雑な処理のシェルスクリプトを作ってみましょう。
本記事で紹介した内容に慣れてきたら、
次の記事を参考に実用的なシェルスクリプトの作成を目指してみるのもよいかと思います。
【Linux】実用的なシェルスクリプトの書き方|配列・引数などを解説


コメント