7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

csh(tcsh)で気をつけるべきこと

Last updated at Posted at 2019-01-09

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と書く

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?