csh cシェル 簡単なシェルプログラミングまとめ



csh(cシェルと読む)は、UNIX上のコマンドインタプリタで、 コマンドを読み込み、解釈し、実行までを行います。

シェルプログラムはシェルが解釈するコマンドの集まりです。 コマンドを組み合わせて、多様な機能をもつ新たなコマンドが作れます。 cシェルの動作は以下のようになります。

スポンサードリンク

簡単なシェルプログラミング

全体構造

 #! /bin/csh

  ...
  ...
!/bin/csh -fZCX

とスクリプト1行目に書くと、 ~/.cshrc を読み込まみません。-f オプションを 付けていないスクリプトでは ~/.cshrc中で定義している設定(alias等)が有効に なります。

if 文

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ファイルサイズがゼロ

これらの表現式は、ファイルついての状態を調べ真であれば1、偽であれば0を表します。

foreach 文

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 文

while (条件式)
  コマンド1
  コマンド2
  :
  コマンドN
end

【注意】最後に改行が無ければループしません。

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

C Shellの演算子

演算子 説明
ヒストリ:h パス名の最後の部分だけを除いたパス名を取り出す
ヒストリ:t パス名の最後の部分だけを取り出す
ヒストリ:r 拡張子を取り除く
ヒストリ:e 拡張子だけをを取り出す
ヒストリ:s/l/r/ 文字列lをrに変換する
ヒストリ:q 文字列をクォートする
ヒストリ:x 文字列を空白やタブで区切り、クォートする
ヒストリ:g 全ての句について修飾
ヒストリ:a 全ての文字について修飾
ヒストリ:& 前回の置換をもう一度
ヒストリ:p コマンドを実行せず、表示だけ行う

いずれもヒストリはパラメータ指定を含んでいてもよいです。

複数画像を一度に bmp形式に変換(mogrify と同じ)して、100から始まるファイル名に変更します。

#!/bin/csh

set l = 100

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

「img2bmp」という名前で保存したとすると、使い方は次のように行います。

$ ./img2bmp *.gif 

なお「convert」というコマンドを利用しています。利用している環境にconvertコマンドが存在しないと正しく動作しません。

スポンサードリンク

番外

C Shell を使わずにファイル名からディレクトリや拡張子を取り除くには次のように行います。

$ basename /home/hoge/file1.txt .txt ←取り除く拡張子を末尾で指定
file1

また、C Shell を使わずにパス名の最後の部分だけを取り除くには次のように行います。

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

特別な変数

変数説明
$0 シェルが起動された時のコマンド名
$< 標準入力から1行読み込んで、その値を返す
$$ この変数を評価したcshのプロセス番号
$! 最後にバックグラウンドで実行したプロセスのプロセス番号

なお、C Shell は実数の処理は行えなません。Perl などを利用しましょう。

リダイレクト (但しcsh系の場合noclobberの設定による)

作業 sh系
(sh,bash,ksh,zsh等)
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 > file1) >& file2

sh系なら次のようになります。

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

また、csh系なら次のようになります。

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

スポンサードリンク

スポンサードリンク