C Shell
いくつもの革新的機能により対話型利用では人気となったが、csh はスクリプト言語としては人気を獲得することはなかった。当初から1980年代末まで、cshはあらゆるUnixシステムに実装されていたわけではなく、shならばあらゆるUnixシステムに存在することが確実だった。したがって、様々なシステムで動作する可能性のあるスクリプトはshで書くのが賢明だった。1990年代中ごろにはcshも広く利用可能となったが、POSIXの委員会からcshをスクリプト言語として使用することに対して批判の声が挙がった。すなわち、対話用とスクリプト用の推奨シェルは1つであるべきだとし、POSIXとしては KornShell を推奨するとしたのである。C shell は他にも、文法上の欠陥、機能不足、実装のまずさといった点で批判された。
testプログラムを "test" と "[" の両方にハードリンクすることで、角括弧表記の利点が生まれ、testの機能があたかもshの一部であるかのような錯覚を与える。shで制御ブロックの終端にキーワードを逆に綴ったものを置くのは、ALGOL 68 のスタイルを踏襲したものである。
対照的にcshは自前で式を評価でき、高速である。可読性もよいと言われている。演算子や構文の多くはC言語のものをそのまま使っている。キーワードを逆に綴ることもなく、全体としてよりC言語に近いスタイルである。
次の例は、2の1乗から10乗までを計算するスクリプトを比較したものである。
やはりshには式の文法が存在しないため、shのスクリプトはコマンド置換(英語版)とexprコマンドを使っている。C shell の @ 文(コマンド)は一種の駄洒落であり、"at-sign-ment" すなわち代入文を意味している。
最後の例は、switch文のスタイルの違いを示したものである。
shのスクリプトでは、";;" で各ケースの終りを示す。通常は空文を許さないため、これはケースの終りを目立たせるためである。
ワイルドカード処理をシェルが行うようにしたことは、Unixにおける重要な決定の1つである。つまり、どのコマンドでも同じようにワイルドカードが使え、シェルだけがワイルドカード処理に必要なコードを備えていればよい。しかし、そのために子プロセス生成時のexecシステムコールには非常に長い引数を効率的に渡す必要が生じた。対照的にWindowsはコマンド行をUnicodeでおよそ32K文字までに制限しており、ワイルドカード処理は各アプリケーションが行うようになっている(実際にはC言語のmain()関数を実行する前にCのランタイムコードが自動的に行う)。これはMS-DOSからの伝統である。MS-DOSではアプリケーションに渡せるコマンド行は128バイトに制限されていたため、ワイルドカード処理をコマンドプロンプト側で行うのは非現実的だった。
素早いキーストロークで以前に入力したコマンド行を呼び出して再実行することができる。例えば、感嘆符を2つ "!!" と入力すると、直前に入力したコマンドを再実行できる。他にも "!$" と入力すると直前のコマンド行の最後の引数に置換される。
csh は条件分岐と反復という制御構造を提供している。条件分岐としては if 文と switch文がある。反復としては、while 文、foreach 文、repeat 文がある。