Cシェル(csh)とは、C言語に似た構文を持つLinux/Unixシェルです。
# comment
Cシェルが起動されたとき、ホームディレクトリに.cshrcというファイルが存在すれば、その中に記述されたコマンドが実行される。
また、Cシェルがログイン・シェルとして起動された場合、以下のファイルが存在すれば、その中に記述されたコマンドも実行される。
これらのファイルは次の順序で実行される。
これらのファイルは読み取り可能である必要がある。また、$HOME/.loginと$HOME/.cshrcは当該ユーザーがその所有者であるか、または当該ユーザーのグループIDがそのグループIDと一致するかチェックし、一致したときにのみ実行される。
通常 .login ファイルには、端末の種類や環境を指定するコマンドが入っている。
もし、C シェルを `-' で始まる名前で起動すると、その シェル はログインシェルとして実行される。
X環境では、-lsオプションを付けて起動したxtermやktermはログイン・シェルとなるが、-lsオプションを付けないで起動したxtermやktermはログイン・シェルにはならない。
C シェルが持っている別名のリストは、alias および unalias コマンドを使用してユーザーが作成、表示、および変更できます。シェルは、各コマンドの最初のワードが既存の別名に一致するかどうかをチェックします。一致すれば、そのワードを別名に置き換えて再度コマンド処理を実行します。履歴置換のメカニズムは、そのコマンドが前の入力行であったかのように行うことが可能です。これによって履歴置換は (定義中ではバックスラッシュでエスケープされる) 、別名が使用されているとき、実際のコマンド行引数で置き換えることができます。履歴置換が 1 度も呼ばれていなければ、引数は変更されません。
別名はネストできます。すなわち、別名の定義の中に別の別名を入れてもかまいません。ネストされた別名は履歴置換が実行される前に展開されます。
最初のワードを除いて、別名を自分自身の定義内、また定義が参照している他のいかなる別名内にも書いてはいけません。このようなループが見つかると、エラーメッセージが表示されます。
Cシェルですべての環境変数の値を表示するには、envコマンドを実行する。
% env
C シェルは、起動したプロセスに自動的に値がエクスポートされる環境変数と、そうでないシェル変数を区別します。この点は Bourne シェルとは異なります。
Cシェルを終了させてログアウトするには、exitコマンドを実行する。
% exit
または、^D (Ctrl + D)を入力することで、ログアウトすることができる。
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 ( 条件 ) 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
C シェルで変数に値を代入する書式を次に示します。
% set name=value
代入する値を省略すると、空の値 (NULL) を変数に代入します。
% set name
等号「=」の左右に半角スペースを入れて見やすくすることも可能です。ただし、半角スペースを入れる場合は、等号の左右両方に入れなければなりません。どちらか片方だけだとエラーになります。
% set var = 123
変数には1つの値だけでなく、複数の値を入れることができます。複数の値を代入した変数のことを 配列 と呼びます。変数に複数の値を入れるには、空白で区切った複数の値を中括弧で括って変数に代入します。
値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] です。"
すべての環境変数を表示する。
% setenv
環境変数に空の値を設定する。
% setenv VAR
環境変数に値を設定する。
% setenv PATH /home/tsuka/bin
最もよく使用される環境変数 USER、TERM、および PATH は、自動的に csh 変数 user、term、および path から (へ) インポート (エクスポート) されます。 したがって、これらの変数に setenv を使用する必要はありません。さらにシェルは、csh 変数 cwd が変更されるたびに、その値を環境変数 PWD へ設定します。
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 ( 変数 )
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
環境から 変数名 が示す変数を削除します。 unset のようなパターンマッチングは行いません。
while ( 条件式 )
コマンドリスト
end
コマンドリストは、ひとつのコマンドか、複数のコマンド群です。複数のコマンドを記述するには、次に示す2通りの方法があります。
条件が満たされている(条件式が真)間、whileとendで挟まれたコマンドを反復して実行します。
#!/bin/csh
set c=60
while ( $c > 0 )
echo $c
sleep 1
@ c--
end
標準入力、標準出力および標準エラー出力は初期状態でコンソールに割り当てられているが、Cシェルで別のデバイスに割り当てることができる。この機能を「リダイレクト」と呼ぶ。リダイレクトによって、標準入力から入力を受け付けるコマンドにファイルからデータを読み込ませたり、標準出力へ結果を出力するコマンドの実行結果をファイルへ保存することができる。
標準入力をファイルへリダイレクトします。
標準入力を word と一致する行まで読み取り、それらの行を一 時 ファイルに格納します。word がエスケープされるかクォートされていなければ、格納された行に対して、変数およびコマンド置換が行われます。そして、一時ファイルを標準入力としてパイプラインが起動されます。word は変 数、ファイル名、およびコマンド置換の対象にはなりません。また、各行はシェルによって置換が実行される前に word と比較されます。
標準出力をファイルへリダイレクトします。ファイルが存在しなければ作成します。存在すれば上書きします。このとき、以前の内容は失われます。
変数 noclobber が設定されていれば、既存のファイルを 破壊しません。この変数は、! 形式のいずれかが使用されていないかぎり、端末および /dev/null へのリダイレクションも防ぎます。
項目 | 説明 |
---|---|
標準出力 | リダイレクトする |
標準エラー出力 | リダイレクトしない |
既にファイルが存在する場合 | ファイルを上書き(以前の内容は失われる) |
ファイルが存在しない場合 | ファイルを作成(noclobber変数が設定されていればエラー) |
% grep pattern example.txt > result.txt
標準出力をファイルへリダイレクトします。ファイルが存在しなければ作成します。存在すれば上書きします。このとき、以前の内容は失われます。
項目 | 説明 |
---|---|
標準出力 | リダイレクトする |
標準エラー出力 | リダイレクトしない |
既にファイルが存在する場合 | ファイルを上書き(以前の内容は失われる) |
ファイルが存在しない場合 | ファイルを作成 |
% grep pattern example.txt >! result.txt
標準出力および標準エラーの両方をファイルへリダイレクトします。ファイルが存在しなければ作成します。存在すれば上書きします。このとき、以前の内容は失われます。
変数 noclobber が設定されていれば、既存のファイルを 破壊しません。この変数は、! 形式のいずれかが使用されていないかぎり、端末および /dev/null へのリダイレクションも防ぎます。
項目 | 説明 |
---|---|
標準出力 | リダイレクトする |
標準エラー出力 | リダイレクトする |
既にファイルが存在する場合 | ファイルを上書き(以前の内容は失われる) |
ファイルが存在しない場合 | ファイルを作成(noclobber変数が設定されていればエラー) |
% grep pattern example.txt >& result.txt
標準出力および標準エラーの両方をファイルへリダイレクトします。ファイルが存在しなければ作成します。存在すれば上書きします。このとき、以前の内容は失われます。
項目 | 説明 |
---|---|
標準出力 | リダイレクトする |
標準エラー出力 | リダイレクトする |
既にファイルが存在する場合 | ファイルを上書き(以前の内容は失われる) |
ファイルが存在しない場合 | ファイルを作成 |
% grep pattern example.txt >&! result.txt
標準出力をファイルへリダイレクトします。指定したファイルが既に存在していた場合、ファイルの最後に追加します。noclobber 変数が設定されていると、存在しないファイルに対してはエラーになります。
項目 | 説明 |
---|---|
標準出力 | リダイレクトする |
標準エラー出力 | リダイレクトしない |
既にファイルが存在する場合 | ファイルの最後に追加 |
ファイルが存在しない場合 | ファイルを作成(noclobber変数が設定されていればエラー) |
% grep pattern example.txt >>! result.txt
標準出力をファイルへリダイレクトします。指定したファイルが既に存在していた場合、ファイルの最後に追加します。指定したファイルが存在しない場合、ファイルを作成します。
項目 | 説明 |
---|---|
標準出力 | リダイレクトする |
標準エラー出力 | リダイレクトしない |
既にファイルが存在する場合 | ファイルの最後に追加 |
ファイルが存在しない場合 | ファイルを作成 |
% grep pattern example.txt >>! result.txt
標準出力および標準エラーの両方をファイルへリダイレクトします。指定したファイルが既に存在していた場合、ファイルの最後に追加します。noclobber 変数が設定されていると、存在しないファイルに対してはエラーになります。
項目 | 説明 |
---|---|
標準出力 | リダイレクトする |
標準エラー出力 | リダイレクトする |
既にファイルが存在する場合 | ファイルの最後に追加 |
ファイルが存在しない場合 | ファイルを作成(noclobber変数が設定されていればエラー) |
% grep pattern example.txt >>& result.txt
標準出力および標準エラーの両方をファイルへリダイレクトします。指定したファイルが既に存在していた場合、ファイルの最後に追加します。指定したファイルが存在しない場合、ファイルを作成します。
項目 | 説明 |
---|---|
標準出力 | リダイレクトする |
標準エラー出力 | リダイレクトする |
既にファイルが存在する場合 | ファイルの最後に追加 |
ファイルが存在しない場合 | ファイルを作成 |
% grep pattern example.txt >>&! result.txt
ドル通貨記号は変数名の始まりであることを表す特別な意味を持ちます。この特別な意味を打ち消して単なるドル通貨記号として扱うには、打ち消し文字(エスケープ文字)を使用します。
% echo $variable
variable: 未定義の変数
% echo \$variable
$variable
打ち消し文字には円記号、2重引用符、1重引用符の3種類あり、それぞれ働きが異なります。
打消文字 | 意味 |
---|---|
\ | この文字の後の1文字の特別な意味を打ち消します。 |
" | 文字列単位で打ち消します。ただし、2重引用符(")や感嘆符(!)、ドル記号($)、1重引用符(')の特別な意味は打ち消しません。 |
' | 文字列単位で打ち消します。ただし、ドル記号($)や単一重引用符(')、感嘆符(!)の特別な意味は打ち消しません。 |
次に、シェルスクリプトとその実行例を示します。
% set name=yajima
% echo "$name"
yajima
% echo '$name'
$name
n番目の引数の値を $argv[
n]
で表すこともできます。ただし、n に 0 を指定することはできません。
% cat showpara
echo $#argv $0 $1 $2
% csh showpara p1 p2
2 showpara p1 p2
シェルスクリプトに渡された引数の個数は、$#argv
変数に格納されている。
% cat numberofargs.csh
echo $#argv
% csh numberofargs.csh foo bar baz
3
filec 変数を設定することによって、対話型Cシェルは、部分的に入力されたファイル名またはユーザー名を補完することができます。
% set filec
csh では Esc キーを押すと、ファイル名が補完されます。シェルは作業用ディレクトリからその文字を含むファイル名を検索して、残りの文字を埋めます。 例えば、作業用ディレクトリに mytext というファイルがある場合、vi my と入力して Esc キーを押すと、my という文字列が自動的に mytext というファイル名に補完されます。
ファイル名を部分的に入力して EOF 文字 (通常は CTRL-D) を入力すると、シェルは一致するすべてのファイル名を一覧表示します。そして、入力された不完全なコマンド行の内容を表示して、再度プロンプトを表示します。
最後のワード (入力値の一部) がチルド(~)で始まる場合、 シェルは現在のディレクトリのファイル名ではなく、ユーザー名を補完しようとします。
noclobber変数を設定すると、出力をアペンド(追加)モードでリダイレクトする際に、出力先のファイルが存在しないときにエラーとなる。
ただし、強制リダイレクトの場合はエラーとならない。
% set noclobber
cwd (current working directory) 変数には、現在の作業ディレクトリがフルパスで格納されている。
% echo $cwd
Cシェルには、以下に示す定義済みシェル変数があります。
固定数値や文字列を変数に代入するには 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
goto ラベル
...
ラベル:
コマンド1
特定の処理までジャンプさせます。ジャンプ先にラベルを指定しておき、ジャンプさせる場所にてそのジャンプ先ラベルを指定します。
#!/bin/csh
echo message1
goto label1
echo message2
label1:
echo message3
Cシェルの絶対パスによる表現が /bin/csh
の場合、Cシェルでスクリプトを実行するには、スクリプトファイルの第1行目に次の記述を行います。
#!/bin/csh
~/.historyはcshから実行したコマンドの履歴が格納されるファイルである。
ログインシェルがCシェルの場合、ホームディレクトリに .logout ファイルが存在すれば、ファイルの中に記述されたコマンドがログアウトする際に実行されます。
コマンド行は履歴リストに保存されます。履歴リストのサイズは history 変数によって変更できます。例えば、履歴を50個保持するには次のように設定します。
どのような場合でも、最後に入力されたコマンドは必ず保持されます。履歴置換の指定は ! で始まり (histchars 変数により他の文字に変更可能) 、コマンド行のどこに現われてもかまいません。ただし履歴置換のネストはできません。! を \ でエスケープすれば、その特別な意味を抑制できます。