csh 入門 ---- if .... then ..... else ..... endif

プログラムには分岐が必要です。if 文ががないと判断ができませ ん。2.2 で既に if 文がでて来ましたが、ここではもっといろ いろな if 文を紹介します。

3.1 file の存在を確認する file

1.3 で EUC コードに変換するコマンド 2e を作りました。 2e コマンドでは、file の存在を確認しませんし、 コマンドの引数である、$1 があるかも確認しません。 ここではこれを確認処理するプログラムを作ります。 実行は簡単のため ls のみ行うことにします。
#!/bin/csh     
#           3.1 file を確認し EUC コードに変換する 2e-new 
# $#argv : 引数の総数
if ( $#argv ) then
# もし 引数が 1 個以上あったら file に代入 $argv[1] は $1 と同じ。
   set file = $argv[1]
# なければ使いかたを示して終り。cat << eof は、2.3 を参照。
else
cat << eof
error: The command file expects a file name.
usage: % file filename
eof
# エラーの場合はここで終了にする。1 は終了コード(0 以外なら ok) 
exit(1)
endif
#
# file が存在 (-e) しなかったら (!) 
#
if (! -e "$file") then
echo "error: File $file does not exist."
exit(1)
else
# file が存在するので実行します。ここでは ls のみ 実行です。
ls -l $file 
exit(0)
#
endif

すこし長いですが、理解できると思います。実行してみてください。

! は 否定 (not) を表します。-e は存在するかどうかを示します。- e の後には file 名を期待します。似たような option をまとめま す。

-e : 存在するか?  
-r : 読み込み可能か?
-w : 書き込み可能か?
-x : 実行可能か?
-o : 所有しているか?
-d : directrory か?
-f : (directory でない plain file か?)
うえの 2e-new では、引数として file でなく directory をいれ ても if は ok になってしまいます。directory を排除するために は、if (-d "$file") then として、directory の場合の排除が本 当は必要です。あらゆる場合に対して誤動作しないように作るのが、 望まれますが、個人で使うぶんにはそのへんは自分の責任で手を抜 くことも可能です。

3.2 いろいろな if 文の 例

if 文の例を示します。
#!/bin/csh     
#           3.2 いろいろな if 文の 例 ifex 
set moji = "abc"
if ( "$moji" == "abd" ) then
echo "$moji と abd は 等しい"
endif
#
if ( "$moji" != "abd" ) then
echo "$moji と abd は 等しくない"
endif
#
if ( "$moji" =~ ab* ) then
echo "$moji は 正規表現 ab* で等しい"
endif
#  数字の大小
if ( 3 <= 5 ) then
echo "3 は 5 以下だ"
endif

正規表現では " " ではさむとうまくいきません。endif で fortran のように endとif の間をあけると end: Too many arguments. と error がでる。あけてはいけない。数字で大小はできるが、文字の 大小はできない。などが分かると思う。動いているプログラムをい ろいろいじって動作を確認すると良い。

余談: if 文で分岐として飛ばないところの文法 check は行いませ ん。したがって動作を確認する場合には、全ての場合を確認する必 要があります。これは csh スクリプトが、文を 1 行づつ解釈する インタープリターによって動作するからです。(Basic を知ってい る人ならご存知だと思います。) これに対し c 言語や fortran 言 語などは、コンパイラーといって実行が最適に行われるように翻訳 をする言語は、文法 check をしますので、この作業が不要です。 しかし、この場合にはコンパイラーを通さないといけないので、 手続きが増えまし、実行可能な file の大きさが大きくなります。


rsaito@ee.uec.ac.jp