4.3 条件式と計算

csh スクリプトの条件分岐 (if) やループ (while) などでは、 条件式を利用しますが、そこでは C 言語と同様の数式、条件式が使用できます。 実際には数式、条件式は、
@ の右辺、 if や while の条件式部分 (かっこ内)、 exit の引数 (かっこ内)
で使用できます。ただし、代入文は @ でしか使用できません。

式による変数値の設定文 @ は、基本的には以下のように使用します。

@ name = expr
name は変数名、expr は式を表します。

使用できる数式、条件式は、表 1 の通りです。

表 1: 使用できる数式 (上の方ほど優先順位が高い)
意味
( ) 式のグループ化 (通常の数式のかっこ)
~ 1 の補数
! 論理否定
*, /, % 整数演算での積、商、剰余 (右から)
+, - 和、差 (右から)
<<, >> ビット単位の左シフト、右シフト
<, >, <=, >= 大小の不等号
==, !=, =~, !~ 等号、不等号、パターンの一致、不一致
& ビット単位の AND
^ ビット単位の XOR
| ビット単位の OR
&& 論理式の AND
|| 論理式の OR


このうち、和や積などは普通の数式とは違い右から左へ計算するので、 適宜かっこが必要なことに注意してください。

==, != は、 両辺を文字列として等しいか等しくないかの判別を行います。 また、=~, !~ は、その左辺の文字列が、 右辺のパターン (ファイル名置換パターン) と一致するか (=~) 一致しないか (!~) を判別します。

csh スクリプトのパターンには、通常の文字列に加えて、 表 2 の特殊文字が使用できます。

表 2: パターンの特殊文字
特殊文字 意味
* 0 個以上のすべての文字に一致
? 1 個のすべての文字に一致
[...] かっこ内のすべての 1 文字に一致


ただし、[ ] 内には、- を使って範囲を指定することも可能です。 例えば、
200[0-7].[A-Z][a-z][a-z].[0-9][0-9]
というパターンは、``2007.Dec.27'' のような文字列に一致 (マッチ) します。

なお、このパターンを含む単語が csh スクリプトの コマンドラインで使用された場合、 その単語はそれにマッチするすべてのファイル名を スペースで区切った文字列に展開されます。 例えば

cp ab*.tex dir
というコマンドラインでは、 パターン文字列を含む単語が実際に存在するファイル名による
cp ab.tex ab12.tex ab23.tex abc.tex dir
のようなコマンドラインに展開されてから実行されます。

@ 文では、代入式 = の代わりに C 言語と同様に +=*= のような代入文も使用できます。 また、後置のみですが、++, - も使用できます。例:

@ j ++

さらに、式には「-l name」という形式の 表 3 のファイル検査式も使用できます。

表 3: ファイル検査式
意味
-r name name が読み込み可なら真 (1)
-w name name が書き込み可なら真
-x name name が実行可なら真
-e name name が存在していれば真
-o name name の所有者がユーザなら真
-z name name のサイズが 0 なら真
-f name name が通常のファイルなら真
-d name name がディレクトリなら真


もちろん、!-l の前につければ意味が逆になります。

竹野茂治@新潟工科大学
2008年1月13日