#!/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 の場合の排除が本 当は必要です。あらゆる場合に対して誤動作しないように作るのが、 望まれますが、個人で使うぶんにはそのへんは自分の責任で手を抜 くことも可能です。
#!/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
余談: if 文で分岐として飛ばないところの文法 check は行いませ ん。したがって動作を確認する場合には、全ての場合を確認する必 要があります。これは csh スクリプトが、文を 1 行づつ解釈する インタープリターによって動作するからです。(Basic を知ってい る人ならご存知だと思います。) これに対し c 言語や fortran 言 語などは、コンパイラーといって実行が最適に行われるように翻訳 をする言語は、文法 check をしますので、この作業が不要です。 しかし、この場合にはコンパイラーを通さないといけないので、 手続きが増えまし、実行可能な file の大きさが大きくなります。