Cシェル(csh)入門

Cシェル(csh)とは、C言語に似た構文を持つLinux/Unixシェルです。

ログイン

Cシェルが起動されたとき、ホームディレクトリに.cshrcというファイルが存在すれば、その中に記述されたコマンドが実行される。

また、Cシェルがログイン・シェルとして起動された場合、以下のファイルが存在すれば、その中に記述されたコマンドも実行される。

これらのファイルは次の順序で実行される。

  1. $HOME/.cshrc
  2. /etc/.login (ログイン・シェルの場合)
  3. $HOME/.login (ログイン・シェルの場合)

これらのファイルは読み取り可能である必要がある。また、$HOME/.login$HOME/.cshrcは当該ユーザーがその所有者であるか、または当該ユーザーのグループIDがそのグループIDと一致するかチェックし、一致したときにのみ実行される。

通常 .login ファイルには、端末の種類や環境を指定するコマンドが入っている。

もし、C シェルを `-' で始まる名前で起動すると、その シェル はログインシェルとして実行される。

X環境では、-lsオプションを付けて起動したxtermやktermはログイン・シェルとなるが、-lsオプションを付けないで起動したxtermやktermはログイン・シェルにはならない。

exit

シェルを終了させてログアウトするには、exitコマンドを実行する。

% exit

または、^D (Ctrl + D)を入力することで、ログアウトすることができる。

foreach

foreach 変数 ( 値1 値2 ... 値n )
  コマンド
end

指定した配列の個数だけ処理(foreachとendに挟まれたコマンド)を繰り返します。その際、指定した配列の値を順番に定義変数に代入していきます。処理はn回繰り返され、1回目では値1が変数に代入されます。2回目では値2、3回目では値3、n回目では値nが変数に代入されます。

% cat season.csh
set season=( spring summer fall winter )
foreach str ( $season )
  echo $str
end
% csh season.csh
spring
summer
fall
winter
%

if

指定した条件が真のときんみ処理を実行する。

if ( 条件 ) then
  # 条件が真のときに実行する処理
endif

指定した条件が真か偽かによって処理を分岐する。

if ( 条件1 ) then
  # 条件が真のときに実行する処理
else
  # 条件が偽のときに実行する処理
endif

複数の条件によって処理を分岐する。

if ( 条件1 ) then
  # 条件1が真のときに実行する処理
else if ( 条件2 ) then
  # 条件1が偽、条件2が真のときに実行する処理
else
  # 条件1が偽、条件2が偽のときに実行する処理
endif

条件式には、次に示す条件演算子を使うことができます。

条件式 説明
== 左辺と右辺の値が等しいとき全体として1(真)となる
!= 左辺と右辺の値が等しいないとき全体として1(真)となる
> 左辺の数値のほうが大きければ全体として1(真)となる
< 左辺の数値のほうが小さければ全体として1(真)となる
>= 左辺の数値が右辺の数値以上だったら全体として1(真)となる
<= 右辺の数値が右辺の数値以上だったら全体として1(真)となる
#!/bin/csh
echo -n "yes or no? "
set answer = $<
if ( $answer == "yes" ) then
  echo "YES"
else
  echo "NO"
endif

複数の条件式を組み合わせることもできます。条件式を組み合わせるには、論理演算子を使用します。

論理演算子
論理演算子 説明
式1 && 式2 式1式2の両方が真であるときに、全体として1(真)となる
式1 || 式2 式1式2のいずれかが真であれば、全体として1(真)となる
if ( $ans1 == 0 && $ans2 == 0 ) then
  echo "BEST\!"
else if ( $ans == 0 || $ans2 == 0 ) then
  echo "OK\!"
else
  echo "NO"
endif

CシェルではBourneシェルのファイル演算子を使用することができます。Bourneシェルのファイル演算子だけでなく、以下のファイル演算子を使用することができます。

ファイル演算子
演算子 真となる条件
-e ファイル名 指定されたファイルが存在する
-o ファイル名 指定されたファイルの所有者である
-z ファイル名 指定されたファイルのサイズが0である
#!/bin/csh
if ( -d $argv[1] ) then
  echo "$argv[1] はディレクトリです。"
else
  echo "$argv[1] はディレクトリではありません。"
endif

set

C シェルで変数に値を代入する書式を次に示します。

% set name=value

代入する値を省略すると、空の値 (NULL) を変数に代入します。

% set name

等号「=」の左右に半角スペースを入れて見やすくすることも可能です。ただし、半角スペースを入れる場合は、等号の左右両方に入れなければなりません。どちらか片方だけだとエラーになります。

% set var = 123

変数には1つの値だけでなく、複数の値を入れることができます。複数の値を代入した変数のことを 配列 と呼びます。変数に複数の値を入れるには、空白で区切った複数の値を中括弧で括って変数に代入します。

set 変数名 = ( 値1 値2 値3 ・・・ 値n )

値1を取り出すには、$ 変数名 [1] とします。値2から値5を取り出すには、$ 変数名 [2-5] とします。全ての値を取り出すには、$ 変数名 または $ 変数名 [*] とします。

変数に代入されている値の個数のことを 配列の要素数 と呼びます。配列の要素数は $# 変数名 で参照できます。

% set array = ( spring summer fall winter )
% echo $array
spring summer fall winter
$ echo $array[1]
spring
$	echo $array[2-3]
summer fall
$ echo $#array
4
% set today=`date`
% echo "現在の時刻は $today[3] です。"

< filename

標準入力をファイルへリダイレクトします。

<<word

標準入力を word と一致する行まで読み取り、それらの行を一 時 ファイルに格納します。word がエスケープされるかクォートされていなければ、格納された行に対して、変数およびコマンド置換が行われます。そして、一時ファイルを標準入力としてパイプラインが起動されます。word は変 数、ファイル名、およびコマンド置換の対象にはなりません。また、各行はシェルによって置換が実行される前に word と比較されます。

> filename

標準出力をファイルへリダイレクトします。ファイルが存在しなければ作成します。存在すれば上書きします。このとき、以前の内容は失われます。

変数 noclobber が設定されていれば、既存のファイルを 破壊しません。この変数は、! 形式のいずれかが使用されていないかぎり、端末および /dev/null へのリダイレクションも防ぎます。

項目説明
標準出力 リダイレクトする
標準エラー出力 リダイレクトしない
既にファイルが存在する場合 ファイルを上書き(以前の内容は失われる)
ファイルが存在しない場合 ファイルを作成(noclobber変数が設定されていればエラー)
% grep pattern example.txt > result.txt

>! filename

標準出力をファイルへリダイレクトします。ファイルが存在しなければ作成します。存在すれば上書きします。このとき、以前の内容は失われます。

項目説明
標準出力 リダイレクトする
標準エラー出力 リダイレクトしない
既にファイルが存在する場合 ファイルを上書き(以前の内容は失われる)
ファイルが存在しない場合 ファイルを作成
% grep pattern example.txt >! result.txt

>& filename

標準出力および標準エラーの両方をファイルへリダイレクトします。ファイルが存在しなければ作成します。存在すれば上書きします。このとき、以前の内容は失われます。

変数 noclobber が設定されていれば、既存のファイルを 破壊しません。この変数は、! 形式のいずれかが使用されていないかぎり、端末および /dev/null へのリダイレクションも防ぎます。

項目説明
標準出力 リダイレクトする
標準エラー出力 リダイレクトする
既にファイルが存在する場合 ファイルを上書き(以前の内容は失われる)
ファイルが存在しない場合 ファイルを作成(noclobber変数が設定されていればエラー)
% grep pattern example.txt >& result.txt

>&! filename

標準出力および標準エラーの両方をファイルへリダイレクトします。ファイルが存在しなければ作成します。存在すれば上書きします。このとき、以前の内容は失われます。

項目説明
標準出力 リダイレクトする
標準エラー出力 リダイレクトする
既にファイルが存在する場合 ファイルを上書き(以前の内容は失われる)
ファイルが存在しない場合 ファイルを作成
% grep pattern example.txt >&! result.txt

>> filename

標準出力をファイルへリダイレクトします。指定したファイルが既に存在していた場合、ファイルの最後に追加します。noclobber 変数が設定されていると、存在しないファイルに対してはエラーになります。

項目説明
標準出力 リダイレクトする
標準エラー出力 リダイレクトしない
既にファイルが存在する場合 ファイルの最後に追加
ファイルが存在しない場合 ファイルを作成(noclobber変数が設定されていればエラー)
% grep pattern example.txt >>! result.txt

>>! filename

標準出力をファイルへリダイレクトします。指定したファイルが既に存在していた場合、ファイルの最後に追加します。指定したファイルが存在しない場合、ファイルを作成します。

項目説明
標準出力 リダイレクトする
標準エラー出力 リダイレクトしない
既にファイルが存在する場合 ファイルの最後に追加
ファイルが存在しない場合 ファイルを作成
% grep pattern example.txt >>! result.txt

>>& filename

標準出力および標準エラーの両方をファイルへリダイレクトします。指定したファイルが既に存在していた場合、ファイルの最後に追加します。noclobber 変数が設定されていると、存在しないファイルに対してはエラーになります。

項目説明
標準出力 リダイレクトする
標準エラー出力 リダイレクトする
既にファイルが存在する場合 ファイルの最後に追加
ファイルが存在しない場合 ファイルを作成(noclobber変数が設定されていればエラー)
% grep pattern example.txt >>& result.txt

>>&! filename

標準出力および標準エラーの両方をファイルへリダイレクトします。指定したファイルが既に存在していた場合、ファイルの最後に追加します。指定したファイルが存在しない場合、ファイルを作成します。

項目説明
標準出力 リダイレクトする
標準エラー出力 リダイレクトする
既にファイルが存在する場合 ファイルの最後に追加
ファイルが存在しない場合 ファイルを作成
% grep pattern example.txt >>&! result.txt

env

すべての環境変数の値を表示するには、envコマンドを使用します。

env

C シェルは、起動したプロセスに自動的に値がエクスポートされる環境変数と、そうでないシェル変数を区別します。この点は Bourne シェルとは異なります。

setenv

すべての環境変数を表示する。

% setenv

環境変数に空の値を設定する。

% setenv VAR

環境変数に値を設定する。

% setenv PATH /home/tsuka/bin

最もよく使用される環境変数 USER、TERM、および PATH は、自動的に csh 変数 user、term、および path から (へ) インポート (エクスポート) されます。 したがって、これらの変数に setenv を使用する必要はありません。さらにシェルは、csh 変数 cwd が変更されるたびに、その値を環境変数 PWD へ設定します。

unsetenv

unsetenv 変数名

環境から 変数名 が示す変数を削除します。 unset のようなパターンマッチングは行いません。

エスケープ文字

ドル通貨記号は変数名の始まりであることを表す特別な意味を持ちます。この特別な意味を打ち消して単なるドル通貨記号として扱うには、打ち消し文字(エスケープ文字)を使用します。

% echo $variable
variable: 未定義の変数
% echo \$variable
$variable

打ち消し文字には円記号、2重引用符、1重引用符の3種類あり、それぞれ働きが異なります。

打消文字 意味
\ この文字の後の1文字の特別な意味を打ち消します。
" 文字列単位で打ち消します。ただし、2重引用符(")や感嘆符(!)、ドル記号($)、1重引用符(')の特別な意味は打ち消しません。
' 文字列単位で打ち消します。ただし、ドル記号($)や単一重引用符(')、感嘆符(!)の特別な意味は打ち消しません。

次に、シェルスクリプトとその実行例を示します。

% set name=yajima
% echo "$name"
yajima
% echo '$name'
$name

$argv[]

n番目の引数の値を $argv[n] で表すこともできます。ただし、n に 0 を指定することはできません。

% cat showpara
echo $#argv $0 $1 $2
% csh showpara p1 p2
2 showpara p1 p2

$#argv

シェルスクリプトに渡された引数の個数は、$#argv 変数に格納されている。

% cat numberofargs.csh
echo $#argv
% csh numberofargs.csh foo bar baz
3

filec

filec 変数を設定することによって、対話型Cシェルは、部分的に入力されたファイル名またはユーザー名を補完することができます。

% set filec

csh では Esc キーを押すと、ファイル名が補完されます。シェルは作業用ディレクトリからその文字を含むファイル名を検索して、残りの文字を埋めます。 例えば、作業用ディレクトリに mytext というファイルがある場合、vi my と入力して Esc キーを押すと、my という文字列が自動的に mytext というファイル名に補完されます。

ファイル名を部分的に入力して EOF 文字 (通常は CTRL-D) を入力すると、シェルは一致するすべてのファイル名を一覧表示します。そして、入力された不完全なコマンド行の内容を表示して、再度プロンプトを表示します。

最後のワード (入力値の一部) がチルド(~)で始まる場合、 シェルは現在のディレクトリのファイル名ではなく、ユーザー名を補完しようとします。

noclobber

noclobber変数を設定すると、出力をアペンド(追加)モードでリダイレクトする際に、出力先のファイルが存在しないときにエラーとなる。

ただし、強制リダイレクトの場合はエラーとならない。

% set noclobber

cwd

cwd (current working directory) 変数には、現在の作業ディレクトリがフルパスで格納されている。

% echo $cwd

定義済み変数

Cシェルには、以下に示す定義済みシェル変数があります。

argv
引数リスト。シェルの今回の呼び出しの際に渡されたコマンド行引数リストを含んでいます。この変数は、$1 や $2 などの定位置パラメタの値を決定します。
cdpath
cd、chdir、および popd コマンドが検索するディレクトリのリスト。これらのコマンドが受け取ったディレクトリ引数が現在のディレクトリのサブディレクトリでないとき、この変数が示すディレクトリ群が検索されます。
echo
実行前に置換後のコマンドをエコーします。
fignore
ファイル名を補完させるときに無視するファイル名接尾辞のリスト。典型的な例は `.o' の 1 ワードだけ。
hardpaths
設定すると、ディレクトリスタック内のパス名は、シンボリックリンクの構成要素を含まないように展開されます。
histchars
2 文字の文字列。最初の文字は、履歴置換文字として ! を置き換えます。2 番目の文字は、高速置換のためのキャレット (^) を置き換えます。
history
履歴リストに保存される行数。この数が大きすぎる と、 Cシェルのメモリすべてを消費してしまいます。設定されないと、C シェルは最新のコマンドのみを保存します。
home
ユーザーのホームディレクトリ。ファイル名展開の ~ は、この変数の値を指します。
ignoreeof
設定すると、シェルは端末からの EOF を無視します。これにより、CTRL-D を誤って入力して C シェルを終了させてしまうことが防げます。
mail
C シェルがメールの有無をチェックするファイルのリスト。値の最初のワードが数字の場合、メールをチェックする間隔を秒数 (デフォルトは 5 秒) で表します。
nobeep
あいまいなファイル名を C シェルに拡張させる際、一致 したものを見つけたときに発生するビープ音を抑止します。
noclobber
既存のファイルが間違って破壊されないように出力先のリダイレクションを制限します。> は新規のファイルへのみ出力 先をリダイレクションできます。>> は既存のファイルへのみ出力先をリダイレクションできます。
noglob
ファイル名置換を禁止します。これは、シェルスクリプト内で一度ファイル名 (もしあれば) を取得した後、これ以上拡張したくないときに便利です。
nonomatch
パターンが一致しなかったとき、エラーではなくファイル名置換パターンを返します。パターンが間違っているときは、エラーを返します。
notify
設定すると、シェルはプロンプトの発行まで待つことなく、 ジョブの終了を即座に報告します。
path
コマンドを検索するディレクトリのリストです。path は 環 境 変 数 PATH から初期化されます。この環境変数は、path を変更するたびに C シェルによって更新され ま す。 NULL ワードは現在のディレクトリを指定します。デフォルトは通 常 (/usr/bin .) です。.cshrc ファイル ま た は .login ファイル (ログインシェルのみ) 中の設定は、csh 起動時に この初期検索パスを上書きします、path が設定さ れ な い と、 完全なパス名だけが実行されます。対話型の C シェル は、通常 .cshrc の読み取り後と path の再設定時には、必 ずリストされたディレクトリの内容をハッシングします。新 しいコマンドが追加されたときは、rehash コマンドを使 用 してテーブルを更新します。
prompt
対話型 C シェルのプロンプト文字列。 非対話型シェルの prompt 変数は未設定のままです。 対話型でのみ有効な .cshrc ファイル内の別名および他のコマンドは、 `if ($?prompt == 0) exit' という記述の後におくことができ、これによって、非対話型シェルの起動時間が短縮できます。 prompt 文字列内の ! は、現在のイベント番号で置換されます。 デフォルトプロンプトは通常の hostname% または特権ユーザー用の hostname# です。
savehist
ユーザーがログアウトしたときに ~/.history に保管される履歴リストの行数。savehist の値が大きすぎると、Cシェルの起動処理が遅くなります。
shell
C シェルが存在するファイル。実行ビットがセットされてい るがシステムにより実行できないようなファイルを解釈する ために、シェルをフォークする際に使用します。
status
最新のコマンドによって返されたステータス。 そのコマンドが異常終了した場合、ステータスに 0200 が加算されます。 異常終了した組み込みコマンドは、終了状態 1 を返します。 他のすべての組み込みコマンドは、ステータスを 0 に設定します。
verbose
履歴置換の後で各コマンドを表示します。

@

固定数値や文字列を変数に代入するには set コマンドを使用しますが、計算した結果を変数に代入するには @ コマンドを使用します。

@ var = expr

var には値を代入する変数の名前、 expr には変数に代入する値の式を指定する。

計算に使用する演算子を示します。

演算子 意味
+ 足し算 12 + 3
- 引き算 12 - 3
* 掛け算 12 * 3
/ 割り算 12 / 3
set var = 10
@ var = $var + 10
@ var = $var - 10
@ var = $var * 10
@ var = $var / 10

計算と代入を一度に行う演算子もあります。

演算子 意味
+= 足し算 @ var += 10
-= 引き算 @ var -= 10
*= 掛け算 @ var *= 10
/= 割り算 @ var /= 10
++ 1増やす @ var++
-- 1減らす @ var--

変数に代入する値をキーボードから入力したい場合は、代入値として「$<」を使用します。

echo -n "探すファイルの名前を入力してください: "
set file = $<
echo -n "ファイルを探すディレクトリを入力してください: "
set dir = $<
find $dir -name "$file" -print

alias

C シェルが持っている別名のリストは、alias および unalias コマンドを使用してユーザーが作成、表示、および変更できます。シェルは、各コマンドの最初のワードが既存の別名に一致するかどうかをチェックします。一致すれば、そのワードを別名に置き換えて再度コマンド処理を実行します。履歴置換のメカニズムは、そのコマンドが前の入力行であったかのように行うことが可能です。これによって履歴置換は (定義中ではバックスラッシュでエスケープされる) 、別名が使用されているとき、実際のコマンド行引数で置き換えることができます。履歴置換が 1 度も呼ばれていなければ、引数は変更されません。

別名はネストできます。すなわち、別名の定義の中に別の別名を入れてもかまいません。ネストされた別名は履歴置換が実行される前に展開されます。

最初のワードを除いて、別名を自分自身の定義内、また定義が参照している他のいかなる別名内にも書いてはいけません。このようなループが見つかると、エラーメッセージが表示されます。

goto

goto ラベル
...
ラベル:
コマンド1

特定の処理までジャンプさせます。ジャンプ先にラベルを指定しておき、ジャンプさせる場所にてそのジャンプ先ラベルを指定します。

#!/bin/csh
echo message1
goto label1
echo message2

label1:
echo message3

shift

shift varriable

shift命令を使うと、配列の要素をずらす(シフト)ことができます。シフトすると、2番目の要素が1番目となり、3番目の要素が2番目・・・・・・と配列の要素がひとつづつずれます。1番目の要素の内容は無くなり、全体の要素数はひとつ減ります。

#!/bin/csh
set array = ( a b c d e )
echo "arayの内容は $array です。"
echo "arrayの要素数は $#array です。"
shift array
echo "arayの内容は $array です。"
echo "arrayの要素数は $#array です。"

switch

switch ( 変数 )
case パターン1:
  コマンド1
  breaksw
case パターン2:
  コマンド2
  breaksw
default:
  コマンド3
  breaksw
endsw

変数がパターン1と一致すれば、コマンド1を実行します。変数がパターン2と一致すれば、コマンド2を実行します。すべてのパターンに一致しなかった場合、コマンド3を実行します。

パターンで指定できる文字
文字 意味
* 任意の文字列
? 任意の1文字
[] []の中で指定された文字の中の任意の1文字
switch ( $string ) then
case [a]*:
  echo "OK"
  breaksw
default:
  echo "NO"
  breaksw
endsw

while

while ( 条件式 )
コマンドリスト
end

コマンドリストは、ひとつのコマンドか、複数のコマンド群です。複数のコマンドを記述するには、次に示す2通りの方法があります。

条件が満たされている(条件式が真)間、whileとendで挟まれたコマンドを反復して実行します。

#!/bin/csh
set c=60
while ( $c > 0 )
echo $c
sleep 1
@ c--
end

#!/bin/csh

Cシェルの絶対パスによる表現が /bin/csh の場合、Cシェルでスクリプトを実行するには、スクリプトファイルの第1行目に次の記述を行います。

#!/bin/csh

~/.history

~/.historyはcshから実行したコマンドの履歴が格納されるファイルである。

~/.logout

ログインシェルがCシェルの場合、ホームディレクトリに .logout ファイルが存在すれば、ファイルの中に記述されたコマンドがログアウトする際に実行されます。

履歴

コマンド行は履歴リストに保存されます。履歴リストのサイズは history 変数によって変更できます。例えば、履歴を50個保持するには次のように設定します。

set history=50

どのような場合でも、最後に入力されたコマンドは必ず保持されます。履歴置換の指定は ! で始まり (histchars 変数により他の文字に変更可能) 、コマンド行のどこに現われてもかまいません。ただし履歴置換のネストはできません。! を \ でエスケープすれば、その特別な意味を抑制できます。

!
次の文字が空白文字、タブ、復帰改行、=、または ( でなければ、履歴置換を開始します。
!!
直前のコマンドを指します。他の文字を加えずにこれだけを入力すると、直前のコマンドを繰り返します。
!n
n 番のコマンド行を指します。
!-n
入力中のコマンドから n 個前のコマンドを指します。
!string
string で始まる最新のコマンドを指します。
!?string?
string を含む最新のコマンドを指します。
!?string? additional
string を含む最新のコマンドを指し、その参照コマンドに additional を追加します。
!{string} additional
string で始まる最新のコマンドを指し、その参照コマンドに additional を追加します。
^string1^string2^
文字列 string1 を文字列 string2 に置き換えて、直前のコマンド行を繰り返します。これは以下の履歴置換と同じ動作です。
!:s/string1/string2/.
以前の特定のコマンドを再実行し、さらに同じような置換を行う場合、たとえば 6 番目のコマンドを再実行するには、次のようにします。
!:6s/string1/string2/.