シェルの制御構造(if)

ifの使用方法

シェルでもC言語のようなif文が使用できる。
シェルで使用するif文の形式は次の通り。

  1. 条件が成り立てばコマンドの部分を実行。
    if(条件) then
        コマンド
    endif
    
  2. 条件が成り立てばコマンド1、成り立たなければ、コマンド2の部分を実行。
    if(条件) then
        コマンド1
    else
        コマンド2
    endif
    
  3. 条件1が成り立てばコマンド1、成り立たなければ、条件2を調べて成り立てばコマンド2の部分を実行。
    以下、同様にelse ifの条件を調べて成り立っていればその下のコマンドを実行。
    すべての条件が成り立たなければコマンドnを実行。
    if(条件1) then
        コマンド1
    else if(条件2) then
        コマンド2
           .
           .
    else
        コマンドn
    endif
    
  4. コマンドが1つだけの場合はthenendifが省略できる。
    if(条件) コマンド
    

以上のようにthen と endif がC言語の { と } に対応すると思えば、大体C言語と似ている。

ifの条件

条件のところには ==, !=, >, <, >=, <= など、C言語で数値を比較する演算子(ただし、整数のみ)が使用できる。
そして、==, != などでは数値だけでなく文字列の比較もできる。
2つ以上の条件を組み合わせる時は &&, ||, ( ) などのようなC言語と同じものを使用できる。
条件を否定する時も!というC言語と同じ記号が使用できる。
もう一つ、条件の部分が0以外なら条件が成り立ち、0ならば成り立たないところもC言語と似ている。
また、Cシェル独自のものとして、ファイルやディレクトリなどの、存在を確かめる条件も使用することができる。

-f ファイル名
ファイルが存在するかどうか
-d ディレクトリ名
ディレクトリが存在するかどうか
-e ファイル名(ディレクトリ名)
ファイル名のファイルかディレクトリどちらかが存在するかどうか
-r ファイル名(ディレクトリ名)
ファイル名のファイルかディレクトリが自分の読めるものかどうか
-w ファイル名(ディレクトリ名)
ファイル名のファイルかディレクトリが自分の書き込めるものかどうか
-x ファイル名
ファイル名のファイルが自分の実行できるものかどうか
-o ファイル名(ディレクトリ名)
ファイル名のファイルかディレクトリが自分のものかどうか
-z ファイル名
ファイル名のファイルが大きさが0かどうか

ifの使用例1

まず、コマンドラインから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の使用例2

次に、ifを使って、プログラムファイルが存在していればccでコンパイルするシェルスクリプトを作って実行してみよう。
viで以下のシェルスクリプト(docc1.sh)を作る。

if(-f $argv[1]) then
	cc $argv[1]
	a.out
endif
上のシェルスクリプトを実行すると以下のようになる。

# ls
test.c docc1.sh
# csh docc1.sh test.c    <- test.cをコンパイルしてa.outを実行 
# ls
a.out test.c docc1.sh
#

ifの使用例3

以下のシェルスクリプトはファイル(*.iff)の個数が100個以上あれば、それらのファイルを他のディレクトリ(otherdir)に移動するコマンドである。

if(`ls *.iff | wc -w` > 100) then
	mv *.iff otherdir
endif

練習課題

まとめ

参考


Prev | Next
Home | Contents
abe@injapan.net