シェルスクリプトについて
概要
シェルについて
シェル(shell)は、端末(ユーザー)からの入力内容を解釈し、プログラムの起動や制御などを行うプログラムです。
UNIX系OSで、CUI(コマンドラインのインターフェース)を利用する際に、ユーザから要求される処理の仲介を行います。
シェルスクリプトとは
シェルスクリプト (shell script)とは、複数のコマンド処理をファイルに列挙的に記述し、一括実行できるようにしたスクリプトファイルです。
シェルスクリプトはプログラムの制御構造なども使用できるため、柔軟な処理が可能です。
BシェルとCシェル
シェルには「B系シェル」と「C系シェル」がよく使われています。
B系シェルは、「Borneシェル」という初期のUnixから使用されているシェルの派生バージョンであり、「bash」コマンドなどが有名です。
C系シェルは、CシェルというUnixが発展していく過程で開発されたシェルの派生バージョンで、Cプログラミング言語に似た文法が使えます。「tcsh」などが有名です。
B系シェルの「shコマンド」が解釈できるシェルスクリプトのことを「shスクリプト」と呼び、C系シェルの「cshコマンド」が解釈できるシェルスクリプトのことを「csh スクリプト」と呼びます。
shスクリプトとcshスクリプトでは文法が若干異なるため、同一スクリプトファイルを互換実行することはできません。
シェルスクリプトの作成
シェルスクリプトの作成
シェルスクリプトファイルの拡張子
シェルスクリプトファイルの拡張子は、慣例的に「.sh」とされています。
UNIXのファイルシステムなので拡張子は任意に指定できますが、第三者にもわかりやすくするために「.sh」を使うべきといえます。
実行スクリプトの指定
「#!/bin/sh」をシェルスクリプトファイルの1行目に記述します。
「#!<プログラムのパス>」とは指定したプログラムでスクリプトを実行するという意味です。
プログラムのパスはwhichコマンドなどで調べられます。
「which sh」コマンドを実行すると「/bin/sh」や「/usr/bin/sh」と表示されますので、これらを指定します。
なお、rubyスクリプトファイルならば「#!/usr/bin/ruby」、perlスクリプトファイルならば「#!/usr/bin/perl」と記述します。
コメントの記述
行中に「#」文字がある場合、それ以降をコメントと見なします。
#!/bin/sh
# コメント
GLOBAL_VAR=1 #コメント
スクリプト内容の記述について
UNIXコマンドおよびシェルの組み込みコマンドを行単位で記述します。
処理はスクリプトファイルの先頭行から開始され、スクリプトファイル終端で実行完了します。
最も簡単なシェルスクリプトは、コマンドをそのまま並べることです。
$ cat archive.sh
#!/bin/sh
cd ../www/
zip -r ./backup/data.zip ./data
rm -rf ./date
関数の利用
シェルスクリプトでも関数を作成することができます。
構文は以下の通りです。
関数名()
{
実行処理
}
- 関数は引数を持つことが可能で、関数内ではシェルスクリプトと同様に変数 $1 ~ $n で各引数を参照することが可能です。
- C言語のように括弧の中に引数を記述する必要はありません。
- 関数に引数を渡す場合は、シェルと同じようにスペース区切りで渡します。
- 呼び出し元に終了コードを返す場合は「return コード」と記述します。
サンプルを以下に記述します。
$ cat function.sh
#!/bin/sh
func_sample()
{
if [ $# -gt 0 ]
then
echo "\$0=$0"
echo "\$#=$#"
echo "\$@=$@"
echo "\$*=$*"
echo "\$1=$1"
echo "\$2=$2"
return 0
else
return 1
fi
}
func_sample $@
ret=$?
echo "result=${ret}"
外部シェルスクリプトの呼び出し
各シェルスクリプトで共通に使用したい関数を外部ファイルに作成し、利用に際して呼び出すことができます。
外部ファイルの読込は、各シェル内で「 . ファイル名 」と記述すれば外部ファイルに記述した関数を使用できます。
外部ファイルに「変数」を定義しても同様に使用できます。
. func_lib.sh
シェルスクリプトの実行
スクリプトの実行
バイナリの実行ファイルと同様に、スクリプトは単一プロセスで実行されます。
シェルスクリプトの実行方法は以下の2通りがあります。
シェルスクリプトは、shコマンドの引数にして実行することができます。
sh スクリプトファイルパス
スクリプトファイルに実行権限を与えることで、コマンドとして実行することが可能です。
$ chmod 755 script.sh
$ ./script.sh
実行内容の出力
シェルスクリプトは、バイナリの実行ファイルと同様に、入出力のリダイレクトを行えます。
以下のリダイレクトで標準出力をファイルに出力することができます。
$ ./backup.sh > backup.log
標準エラー出力のリダイレクトを指示する場合には「2>」を指定します。
$ ./backup.sh > backup.log 2>backup_error.log
すべての出力を記録する場合には、以下のように実行します。
$ ./backup.sh > backup.log 2>&1