シェルスクリプトの中では、さまざまな条件を指定して使います。今回は、if文での書き方を中心に「条件」の書き方を解説します。また、スクリプトで問題になりやすい「変数の引用符」についても取り上げます。
シェルスクリプトの中では、さまざまな「条件」を指定して使います。この“条件”とは、基本的に“コマンドの実行結果”になります。
例えば、「if コマンドA then コマンドB else コマンドC fi」のような場合は、コマンドAの実行結果がTRUE(成功)だったらコマンドBが実行され、FALSE(失敗)だったらコマンドCが実行されます。
ファイルの有無や属性、変数の内容などによって判定したい場合は、「test」コマンドを使います。
例えば、「ファイルabcが存在するかどうか」は「test -f "abc"」となります。この場合、abcという名前のファイルが存在した場合、結果はTRUEになります。同様に、「変数VARの内容がxyzかどうか」は「test "$VAR" = "xyz"」で調べることができます。ここで使用している「-f」や「"abc"」、あるいは「=」は、それぞれがtestコマンドの引数なので、空白で区切る必要があります。
testコマンドの実行結果はTRUEかFALSEという値、具体的には「0」か「1」という数値がシェルに返されるだけなので、コマンドラインで実行しても結果を見ることができません。
if文で使うと「0」はTRUE、それ以外はFALSEとして扱われるので、スクリプトの中で試すことができます(※1)。
【※1】シェルスクリプトを作らずに試してみたい場合は、連載『Linux基本コマンドTip』の「test」コマンド(基礎編)を参照。
例えば、以下のスクリプトでは、変数LANG(使用する言語が設定されている環境変数)が「C」だった場合はTRUE、それ以外の場合はFALSEに続けて、LANGの内容を出力しています。
#! /bin/bash if test "$LANG" = "C" then echo "TRUE" else echo "FALSE $LANG" fi
$ chmod +x testlang $ ./testlang FALSE ja_JP.utf8 #← LANGの内容がCではないのでFALSEが表示された $ LANG=C ./testlang #環境変数LANGにCをセットしてtestlangを実行 TRUE #← LANGがCなのでTRUEが表示された
testコマンドは、省略して「[ ]」記号で表現できます。これは、testコマンドと同等の働きを持つ「[」コマンドで実現されています。testコマンドと「[」コマンドの違いは、「[」コマンドは最後の引数として「]」が必要という点です。
例えば、「test -f abc」ならば「[ -f abc ]」、「test "$LANG" = "C"」ならば「[ "$LANG" = "C" ]」となります。
「-f」や「=」などが、それぞれ「[」コマンドの引数であるという点は、testコマンドと同じです。従って、条件を「[ ]」で書く場合も、空白は省略できません。
以下は、先ほどの「testlang」スクリプトを「[ ]」記号で書き換えています。実行結果は同じです。
#! /bin/bash if [ "$LANG" = "C" ] #← 「if test $LANG = C」を「[」コマンドで書き換えた then echo "TRUE" else echo "FALSE $LANG" fi
Copyright © ITmedia, Inc. All Rights Reserved.