csh講座


csh(C Shellと読む)は、UNIX上のコマンド解釈プログラムであり、実行するまで読み込みコマンド、解釈を実行する.
ShellプログラムはShellによって解釈される命令の集合である.このコマンドを組み合わせることで、さまざまな機能を持つ新しいコマンドを作成することができます.Cシェルの動作は以下の通りです.
△簡単なシェルプログラミング
#! /bin/csh
…… 
……

スクリプトの最初の行に#を書くと!/bin/csh-fは、~/.cshrc.-fオプションがない場合は、スクリプトに、~/.cshrcで定義した設定(aliasなど)が有効になります.
if(  ) then
              (      )
          else if (  ) then
              (      )
          else
              (      )
          endif


#! /bin/csh
if ($#argv != 1) then
    echo "a file name should be specified as an argument"
    exit
endif

if  ((-r ${1}.tex) && (-f ${1}.tex)) then
    jlatex $1
else
   echo "file ${1}.tex is not a readable file"
   exit
endif

rm ${1}.log ${1}.aux

if (!(-z ${1}.dvi)) then
    xdvi $1
else
    echo "file ${1}.dvi is empty"
endif

また、ファイル式は次のようになります.
-d:ディレクトリ
-f:通常のファイル
-r:読み取り可能
-w:書き込み可能
-x:実行可能
-e:ファイルが存在するかどうか
-o:所有権
-z:ファイルサイズが0かどうか
これらの式はファイルの状態を調査し、真の値は1、偽の値は0です.

foreach    (  1   2 ……   N)
      1
      2
    ·
    ·
      N
end

例(最後に改行がなければループしない)

#! /bin/csh
foreach f (a.tex b.tex c.tex)
    echo compiling a TeX file $f
    jlatex $f
end <RET>

while(     )
      1
      2
    ·
    ·
      N
end

例(最後に改行がなければループしない)

set n=1
while ( $n <= 10 )
    echo $n
    @ n = $n + 1
end <RET>

Cシェルの演算子
history:hパス名の最後の部分を除去し、残りのパス名を取り出す
history:tパス名の最後の部分のみを取り出す
history:r拡張子を除く
history:e拡張子のみ取り出す
history:s/l/r/文字列lをrに変換
history:q文字列を囲む
history:x文字列を空白、TABで区切って括る
history:gはすべての文を修飾する
history:aはすべての文字を修飾します
history:&前回の置換をもう一度行います
history:pはコマンドを実行するのではなく、単に
どのhistoryでもパラメータ指定を含めることができます.
例:複数枚の画像を一度にbmp形式(mogrifyと同じ)に変換し、100から始まるファイル名に変更する
$ ./img2bmp *.gif

例:img 2 bmpのソースコード(最後に改行がなければループしない)

#!/bin/csh

set l = 100
foreach a ($*)
    convert $a $l:r.bmp
@ l ++
end <RET>

Cシェルを使用せずにファイル名からパスと拡張子を削除

$ basename /home/hoge/file1.txt.txt  ←               
file1

Cシェルを使用せず、パス名の最後の部分だけを削除

$ dirname /home/hogei/file1.txt
/home/hogei/

特別な変数
$0 Shell起動時のコマンド名
$<標準入力(stdin)から1行読み込んで値を返します
$$この変数を評価するcshプロセス番号
$! 最後にバックグラウンドで実行するプロセスのプロセス番号
また,Cシェルでは実数の処理はできない.Perlなどをご利用ください.
リダイレクト(Redirect)(ただしcshの場合はnoclobberの設定によります)
操作
sh系
csh系(csh,tcsh等)
stdoutのリダイレクト
> file
> file
stdoutの追加リダイレクト
>> file
>> file
stderrのリダイレクト
2> file
stderrだけを取り出すことはできません
stderrの追加リダイレクト
2>> file
stderrだけを取り出すことはできません
stdoutとstderrのリダイレクト
> file 2>&1
>& file
stdoutとstderrの追加リダイレクト
>> file 2>&1
>>& file
パイプでstdoutとstderrをコマンドにリダイレクト
2>&1 | command
|& command
stdoutとstderrをそれぞれのファイルにリダイレクト
> file1 2> file2
例:(command>file 1)>&file 2
注意:上の表の|は、実は半角の縦線|を使ってください.ここはレイアウトの便利さのためだけです.
sh系なら

$ find / -name hoge 2>/dev/null

csh系なら

$ find / -name hoge |& grep -v "find:"