28.8 シェルスクリプト

ここではシェルスクリプトについて学びましょう.

シェルスクリプトというのは,シェルに解釈・実行させるスクリプト (プログラム) です. これまではコマンドは一つずつ入力し実行させていましたが,その代わりに,スクリプトとしてファイルに順に並べて記述しておき,まとめて実行させることができます. 複雑な作業を何度も行うときは,シェルスクリプトを作っておくと便利です. 既存のコマンドを利用して簡単にプログラムを作ることができます. 小さなツールであるとか,初期設定ファイルなどでよく用いられます. なお,シェルの種類が異なれば,当然文法が異なるので注意する必要があります. 特に sh 系と csh 系は大きく文法が異なります. ここでは sh 系である bash の文法に沿って説明します.

シェルスクリプトを作ってみる

コンピュータのログイン記録から g999999 が含まれる行だけを抜き出すには,次のコマンドを入力しました (review_s28.1 フィルタ).

promptlast | grep g999999 return2

これを mylast というコマンドにしてみましょう. もちろんこれだけのことならエイリアスでも充分なのですが,シェルスクリプトにしておくと他のプログラムからも呼び出すことができるという利点があります.

エディタなどを使って,以下の内容を mylast というファイル名で保存してください.

#!/bin/sh
last | grep g999999

1行目はこのファイルが sh のシェルスクリプトであることを示すおまじないです. 2行目以降に実行するコマンドを書きます.

次に,このファイルのパーミッションを変更して実行可能にします (review_s13.4.13.2 パーミッションを変える).

promptchmod u+x mylast return2

こうすると,以下のようにパス名を指定することで今作ったシェルスクリプトを実行することができます.

prompt./mylast return2

コマンドを入力したときと同じ結果になりましたね.

このシェルスクリプトのファイルをコマンドサーチパスに含まれるディレクトリに置くことで,新しいコマンドとして実行できるようになります (review_s13.4.12 実行ファイルのパス). 例えば ~/bin が PATH に含まれているならば, ~/bin に置きます.

promptexport PATH=~/bin:$PATH return2 promptecho $PATH return2 /home01/g999999/bin:/sw/lib/wrappers:/sw/fix-apple-x11/bin:/opt/ECC/bin:/opt/HWB/bin:... promptmkdir ~/bin return2 promptmv mylast ~/bin return2 promptmylast return2

このようにして作ったコマンドは,システムに初めから備わっているコマンドと全く同様に実行させることができます.

より複雑なシェルスクリプト

この例では1行だけでしたが,順に実行する多数のコマンドを書いてまとめて実行させることもできますし,変数を使ったり条件分岐や繰り返しなどの制御構造を使ったりすることで,さらに複雑なこともできます.

例えば,以下はカレントディレクトリにある拡張子が .txt のファイルの文字コードを全て日本語EUCに変換するシェルスクリプトです.ちなみにここで用いている i はシェル変数です.

#!/bin/sh
for i in *.txt
do
   nkf -e $i > $i.euc
   mv $i.euc $i
done

filetoeuc.sh

caution このシェルスクリプトはカレントディレクトリの内容を変更します. 実行は自己責任でお願いします.

シェルの詳しい文法については, bash の場合は promptman bash return2 として読めるマニュアルに記述されているほか,ウェブ上や書籍にも豊富に情報がありますので,それらを参照してください.

シェルスクリプトをコマンドとして呼び出した場合は,呼び出した側のシェルとは別のプロセスで実行されるということに注意してください. シェルスクリプトの中で変数を変更したりしても,呼び出した側のシェルには影響はありません. 初期設定ファイルのように読み込まれるものの場合は別です.