csh(tcsh)はあまり評判が良くないと言われていますが、それでもcsh(tcsh)を使うという時に役立てればと思います。よく忘れがちなことを並べました。これから書き足すかもしれません。
##set文
1.setのすぐ後ろはスペースを入れる
2.=の前後もスペースを入れる
3.宣言する変数はアルファベットから始める(「_」など、一部の記号は最初でも大丈夫)
エラーメッセージ
set: Variable name must begin with a letter
=の前後にスペースが空いていない。
変数名がアルファベットから始まっていない。
##if文
1.論理演算子(==や&&など)の前後はスペースを入れる
2.条件の次はthenが付き、最後にendif
3.ifのネスト(入れ子)はしない方がいい(2019.3.7追記)
*ifの後ろとthenの前にスペースを入れると正常に動作することが多いようだ。環境次第だが、筆者のネストが正常に処理されない環境でも正常に処理された。(2019.5.19追記、Twitterにて提案があり、確認しました。ありがとうございました。)
*cshではブロックがはっきりしないせいか、最初のifがfalseで処理されなくても、次の入れ子のifの中が処理されてしまうようだ。奇妙な書き方になるがswitchを用いるとネストができる。trueかfalseかを判定させる条件分岐の時は、先にそれをifで変数にしてswitchを導入する。
#!/bin/csh
#ifを入れ子にしたときの例
set year = 2019
if($year % 4 == 0)then
echo "#"
if($year % 100 == 0 && $year % 400 != 0)then
echo "##"
echo "うるう年ではありません。100の倍数は例外的です。"
else
echo "###"
echo "うるう年です。"
endif
else
echo "####"
echo "うるう年ではありません。"
endif
これだと、実行した時に次の結果が出る。
###
うるう年です。
回避法は例えば以下のようにできる。
#!/bin/csh
#ifを入れ子にしないようにした時の例
set year = 2019
if($year % 4 == 0)then
echo "#"
set four = 1
else
echo "##"
set four = 0
endif
switch($four)
case 1:
if($year % 100 == 0 && $year % 400 != 0)then
echo "###"
echo "うるう年ではありません。100の倍数は例外的です。"
else
echo "####"
echo "うるう年です。"
endif
breaksw
case 0:
echo "#####"
echo "うるう年ではありません。"
breaksw
endsw
これならば、結果は以下の通りとなる。
##
#####
うるう年ではありません。
エラーメッセージ
if: Badly formed number.
if: Expression Syntax.
条件で論理演算子の前後にスペースが入っていない。
これは、条件で論理演算子の前後にスペースを入れていないために出ることがある。
##while文
1.if文と同じく、論理演算子の前後はスペースを入れる
2.終端はend
3.終端の前に条件に使う変数の演算を入れる(時々忘れる)
エラーメッセージ
Directory stack not that deep.
条件式で論理演算子の前後にスペースが空いていない。(知らないとどハマりしそうなエラー)
##switch文
1.項目ごとの終端はbreaksw(独特な終端)
2.終端はendsw(これまた独特な終端)
##awkコマンド
1.条件や処理は' 'でくくる。
2.変数は' 'の外側になるようにする(↓例)
awk '('$number'==1){print $1}' data.txt
*コマンドの条件に関しては論理演算子の前後にスペースを入れなくても良い
#その他#
1.最初に#!/bin/cshと書く