シェルでもC言語のようなif文が使用できる。
シェルで使用するif文の形式は次の通り。
if(条件) then
コマンド
endif
if(条件) then
コマンド1
else
コマンド2
endif
if(条件1) then
コマンド1
else if(条件2) then
コマンド2
.
.
else
コマンドn
endif
if(条件) コマンド
以上のようにthen と endif がC言語の { と } に対応すると思えば、大体C言語と似ている。
条件のところには
==, !=, >, <, >=, <=
など、C言語で数値を比較する演算子(ただし、整数のみ)が使用できる。
そして、==, != などでは数値だけでなく文字列の比較もできる。
2つ以上の条件を組み合わせる時は
&&, ||, ( )
などのようなC言語と同じもの使用できる。
条件を否定する時も!というC言語と同じ記号が使用できる。
もう一つ、条件の部分が0以外なら条件が成り立ち、0ならば成り立たないところもC言語と似ている。
また、Cシェル独自のものとして、ファイルやディレクトリなどの、存在を確かめる条件も使用することができる。
まず、コマンドラインからifを色々と試してみる。
ここでは実行するコマンドの例としてechoコマンドを使用しているが、もちろんこのコマンド以外のコマンドも使用できる。
# if(1) echo test <- 条件が1(0以外)ならば test <- コマンド(echo)が実行される # if(0) echo test <- 条件が0ならばコマンド(echo)は実行されない # set x = 3 # if($x > 1) echo test <- 条件が成り立っているので test <- コマンド(echo)が実行される # if($x + 2 > 1) echo test <- 条件に数式を使う test # set y = 2.5 # if($y > 1.0) echo test <- 条件に実数が使われていると if: Badly formed number. <- エラーになる # set z = aaa # if($z == "aaa") echo test <- 文字列同士を比べる test # ls test1.c test2.c # set f = test1.c # if(-f $f) echo $f exist <- test1.cが存在するかどうか調べてコマンドを実行 test1.c exist # set files = ( `ls *.c` ) # if($#files > 0) echo test <- *.cファイルが1つ以上あればコマンドを実行 # cat test1.c | wc -l <- test1.cの行数を調べるコマンド 238 <- test1.cの行数は238 # if(`cat test1.c | wc -l` > 200) echo test <- test1.cの行数が200以上であればコマンドを実行 test
次に、ifを使ってプログラムファイルが存在していればccでコンパイルするシェルスクリプトを作って実行してみよう。
viで以下のシェルスクリプト(compile.sh)を作る。
上のシェルスクリプトを実行すると以下のようになる。
set f = test.c
if(-f $f) then
cc $f
endif
# ls test.c compile.sh # csh compile.sh <- test.cをコンパイル #
# ls test1.ma test2.ma compile.sh # csh compile.sh test1.c ....... <- test1.cをコンパイル # csh compile.sh test2.c ....... <- test2.cをコンパイル #
# ls test.c compile.sh # csh compile.sh test.c ....... <- test.cをコンパイル # csh compile.sh abc.c abc.c not exist <- abc.cが無いというメッセージを出力 #