csh(cシェルと読む)は、UNIX上のコマンドインタプリタで、 コマンドを読み込み、解釈し、実行までを行います。
シェルプログラムはシェルが解釈するコマンドの集まりです。 コマンドを組み合わせて、多様な機能をもつ新たなコマンドが作れます。 cシェルの動作は以下のようになります。
スポンサードリンク
#! /bin/csh ... ...
!/bin/csh -fZCX
とスクリプト1行目に書くと、 ~/.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 | ファイルサイズがゼロ |
これらの表現式は、ファイルついての状態を調べ真であれば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>
| 演算子 | 説明 |
|---|---|
| ヒストリ: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 などを利用しましょう。
| 作業 | 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:"
スポンサードリンク
スポンサードリンク