ただし、スペースを入れるべきところにスペースを入れないとエラーとなります。 例えば if や while とカッコの間は、 C 言語とは違いスペースを入れる必要があります。
set も、= の左右のスペースが合っていないとエラーになるようで、
``set a=3
'', ``set a = 3
'' はいいのですが、
``set a =3
'', ``set a= 3
'' はだめなようです。
if ( $#argv > 0 ) goto $argv[1]C 言語ならば、 最初の方は $#argv が 0 のときは goto の部分は無視されるので、 $argv[1] が定義されていようがいまいが関係ないのですが、 csh スクリプトの場合は、 この if 文の評価の前に $#argv と $argv[1] の展開をするので、 $#argv が 0 ならば $argv[1] が定義されていないという エラーになってしまいます。 後者も、C 言語ならば $#argv が 0 のときは && の後半は無視されるのですが、 csh スクリプトでは先に $#argv と $argv[1] の展開をしてから if 文の評価をしようとするのでエラーとなります。
if ( $#argv > 0 && $argv[1] == "2" ) then
...
if ( $argv[1] == -h ) thenこの場合例えば $argv[1] に ``-h'' のような文字列が入っていると、 if 文のカッコ内が ``-h'' から始まることになり、 それがファイル検査式と判断されようとしてエラーになるので、 先頭に余計なアルファベットを付加して、
...
if ( "X$argv[1]" == X-h ) thenのようにしないといけません。
...
なお、while 文のカッコ内も式の評価が行われますので同じ問題が起こりますが、 switch 文のカッコ内は式の評価が行われませんので、 このような対処は不要です。
set s1 = ( 3 4 5 )とすると、s2 には ( 1 2 3 4 5 6 7 ) が入ります。 csh スクリプトでは、変数の展開が行われてから式の評価が行われるので、 以下の s2 も上と同じ結果になります:
set s2 = ( 1 2 $s1 6 7 )
set s1 = "3 4 5"しかし、これを
set s2 = ( 1 2 $s1 6 7 )
set s1 = ( 3 4 5 )としてしまうと、$s2[3] が ``3 4 5'' という文字列、 $#s2 は 5 となります。 だから、逆に、
set s2 = ( 1 2 "$s1" 6 7 )
set s1 = ( "1 2" 3 )とすると、s1 が持っていたスペースの含まれる文字列要素 $s1[1] を s2 では保持することができず、バラバラの要素に分かれてしまいます。 特に、`*', `?', `[ ]' のような特別な文字が含まれる 文字列を要素として持つ場合は、 引用符で囲まれなくなった時点で ファイル名パターンマッチ機能が働こうとしておかしくなり得ます。
set s2 = ( $s1 4 5 )
竹野茂治@新潟工科大学