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 name
でname:
が書かれた行以下の処理にジャンプする。
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