シェルスクリプトとは
シェル(端末)によるCUIベースの作業はGUIベースに比べて大きな労力が必要です。まずはコマンドを覚えなければなりませんし、タッチタイピングくらいはできるようになりたいものです。何より、コマンドの種類と入力書式を覚えることが高いハードルとなるでしょう。ですがコマンドの知識はシェルスクリプトの作成でも力強い戦力になります。シェルで用いられるコマンドは古い歴史を持ち、多くの人が「いかにして(入力の手間を)サボるか」ということを考えてきました。歴史とともに機能強化とバグフィックスを繰り返し、とても洗練されています。それらのコマンドを組み合わせ、さまざまな作業を一度に行うものを「シェルスクリプト」と呼びます。
シェルスクリプトに限りませんが、一般に「スクリプト」は記述したコマンドを順に実行させるのでコンパイルされたバイナリファイルに比べて実行速度は決して速くありません。ですが、テキストエディタで簡単に修正が可能で、ごく単純な作業をするものから、内部から別のスクリプト、コマンドを呼び出すことができたり、一定の作業に特化、固定化されたバイナリファイルよりも柔軟に活用することができます。
Ubuntuのシェルは、アプリケーションのメニューから[アクセサリ]-[端末]です。一例として、/etc/init.dディレクトリにあるconsole-screen.shというファイルをlessコマンドで開いてみましょう(*1)。「#!/bin/sh」に続いて、続々とコマンドが記述されています。
*1端末でcd /etc/init.dと打ち込むとinit.dディレクトリに移動します。その後、less console-screen.shでconsole-screen.shの中身を閲覧できます。console-screen.shの閲覧から抜けるにはキーボードの[q]を入力します。
これはシステム起動時のコンソールを設定するシェルスクリプトです。シェルスクリプトの1行目には、必ず「#!/bin/sh」とあります。これは「このスクリプトはBourneシェルを使って動作させる」という宣言です。
Linuxの標準シェルは「bash」(Bourne-Again Shell)ですが、他にもcsh、tcsh、zshなどの種類があり、それぞれのシェルに固有の機能や設定方法があります。その中でも初期に用いられてきたのが「sh」(Bourne Shell、Bシェル)です。bashの正式な名称が「Bourne-Again」とあるのは、Bシェルが、使いやすくなって戻ってきた(Again)シェルというわけです。
シェルスクリプトを組み立てる場合、シェル固有の設定や文法に違いがあると正常に機能しません。とくにBシェルとCシェル(csh)系列では文法や書式が違います。ユーザーの好みによって、標準シェルがtcshやkshといった他系統のシェルになっていることもあります。そこでシェルスクリプトでは「実行はBシェルを使用する」と、行頭に「#!/bin/sh」と記述(宣言)するのです。
サーバーの設定ファイルなどでは行頭に「#」があるとコメント行となり、以降の文字は説明や注意書きなどをメモが記入されます。上の例でも2行目以降の「#」はコメント行で、コピーライトやスクリプトの説明になっています。ですが、スクリプトファイルでの1行目「#!」は「マジックナンバー」と呼ばれる実行環境の宣言で、コメント行ではありません。perlスクリプトで行頭に「#!/usr/bin/perl」と宣言するのも同じ理由です。
逆に言えば、多機能なシェルの機能を使って組んだシェルスクリプトなら、必要な設定を行った後で「#!/usr/bin/tcsh」でも「#!/usr/bin/zsh」などと宣言しても構いません。ただ、シェル固有の機能を使ったシェルスクリプトは動作環境に制限が出てきます。他の人がそれらのシェルをインストールしているとは限りませんし、自分一人で使うにしても、何かシェル設定の変更をしただけで動作しなくなることもあります。その意味でもシェルスクリプトの組み立てには、必要最小限の機能に限られたBシェルを指定します。
またシェルスクリプトは通常「○○○.sh」というファイル名が用いられます(例外もあります)。Windowsは拡張子に「.EXE」という形で実行可能なファイルが明確であるのに対し、Linuxは「新しいファイル.txt」でも内容がスクリプトになっていれば実行可能ですし、コンパイルしたバイナリファイルをそのような曖昧なファイル名に仕立てることもできます。ファイル名だけではそれがどのようなファイルなのかが明確ではありません。また自分である程度のシェルスクリプトが作成可能になったとき、どのようなファイルなのか明確にする意味でも、シェルスクリプトの拡張子は「.sh」という癖をつけておいた方がよいでしょう。