tcshメモ書き


bashと微妙に違うtcshの文法について、メモ書きとして残しておきます。
(CシェルはC言語とよく似た文法ではあるが中途半端で分かりにくい...)

シェバン行

文頭に記述する行であり、コメントではない。
#!の後ろに書かれたシェルを用いてシェルスクリプトは実行される。

test.sh
#! /bin/tcsh -f

変数宣言いろいろ

cシェルではset,setenv,aliasで宣言方法に差異があるので要注意。

setを使う

set var = a # OK bashと違ってスペースがないとエラーが出ます。
set var=a   # ダメ
set var =a  # ダメ
set var= a  # ダメ
#配列を宣言(配列番号は1origin)
set arr = ( 10 20 30 40 50 )  
#参照例
$ echo $arr[3] 
30     #output

setenv を使う(環境変数)

setenv var a   #変数名と変数の間に'='は不要

aliasを使う(コマンドに別名を与える)

#ここではエイリアス'ls'にコマンド'ls -l'が代入される
alias ls ls -l  #エイリアスとコマンドの間に'='は不要

制御構文

ここでは繰り返し処理と条件分岐、またそのとき条件の指定に用いる演算子についてまとめる。

条件式いろいろ

整数に関する条件式

条件式 意味
int1 == int2 int1とint2が等しい
int1 != int2 int1とint2が等しくない
int1 < int2 int1はint2より小さい
int1 <= int2 int1はint2以下
int1 > int2 int1はint2より大きい
int1 >= int2 int1はint2以上

ファイルに関する評価演算子

条件式 意味
-e file fileが存在する
! -e file fileが存在しない
-d file fileが存在しディレクトリ
-h file fileが存在しシンボリックリンク
-f file fileが存在し通常ファイル

while ループ

'()'の両側にスペースがないとエラーが出ます

while ( 条件式 )
   <処理>
end

if 条件分岐

これも'()'の両側にスペースがないとエラーが出ます

if ( 条件式 ) then
    <処理>
else if ( 条件式 ) then
    <処理>
else 
    <処理>
endif

goto文

goto namename:が書かれた行以下の処理にジャンプする。
if文と併用。あんまり使わない方がよい。

name:
<処理>

goto name

算術演算

算術演算には行頭に@をつける。

set var = 5
@ var = $var + 3   #ここでは5+3が実行され、変数varの値は8となっている。

その他Tips

コマンドの実行結果を変数に代入する

set var = `<コマンド>`
#使用例
set var = `pwd`  #変数varにカレントディレクトリのパスが代入される  

ファイルパスからファイル名だけを取り出す

filename <ファイルパス>

ファイルパスからディレクトリだけを取り出す

dirname <ファイルパス>

例文

最後に適当に例文を載せておく

#!/bin/tcsh -f
set ystr = 2005
set iyy = $ystr
set yend = 2010
set INPUT = $HOME/data
set OUTDIR = $HOME/data2
while ( $iyy <= $yend )
  set OUTPUT = $OUTDIR/$iyy 
    if ( ! -e $OUTPUT ) then
       mkdir -p $OUTPUT         #$OUTPUTで指定されるディレクトリがなかったら作成する
    endif
    cp $INPUT/$iyy/data.csv $OUTPUT/newdata.csv
@  iyy = $iyy + 1
end