UN Ⅸへの招待⑩ % cat ーⅡ ayagrep 1 2 3 4 5 6 7 # ! /bin/csh if ( $#argv く 2 ) then echo "Usage : $ 0 string filename' exit endif grep $ 1 $ 2 8 ・ if ( $status ! = 0 ) echo $ 1 ot fo Ⅲ 1d. かった場合にその旨のメッセージを表示するようにしてい / 以外を返しますから、 8 行目ではそれを調べて文字列がな に文字列が存在しないと grep は終了ステータスとして 0 の引数で指定されたファイルから検索します。ファイル中 この例では、 1 番目の引数で指定された文字列を 2 番目 OS not found. % sample OS title たのしい I 刑 IX ーー測 IX への招待 I % sample UNIX title 、ゝます。 次の例では、終了ステータスを利用して lpq コマンドか ら出力される実行結果のなかに文字列、、自分のログイン名〃 がなくなるまで繰り返し lpq を実行します。 echO $status % cat 1 2 3 4 5 6 7 8 ー ayalpq # ! /bin/csh set dou= ( 1 円コ grep $user > /dev/null while ( $dou echo " まだでない set dou=' lpq ー grep $user > /dev/null ; echo $status ( sleep 1 end echo " でたぞ % 1pr filename % ayalpq まだでない・・ まだでない・ まだでない・ でたぞー シェルプログラムからの終了ステータス UN Ⅸのコマンドと同様、シェルプログラムを終了する ときにも必要に応してさまざまな終了ステータスを親プロ セスに返すことができます。それには exit コマンドを使い ます。 exit は、 ( いままで何回も使ったように ) シェルを終 了するコマンドですが、 exit ″〃 2 という形式で使用すると、〃″で指定した数値が親プロ セスに終了ステータスとして返されます。また、〃″襯を省 158 略すると 0 が終了ステータスとして返されます。ごく単純 な例を見てみましよう。 % cat sample # ! /bin/csh exit $ 1 % sample 10 % echO $status 10 % sample 2 % echO $status 2 % sample % echo $status 0 シェルプログラムの終了ステータスを調べながら何かの UNIX MAGAZINE 1990.11
IJN Ⅸへの招待⑩ バックします。ただし、シェルの組込みコマンドの場合に は、メタキャラクタは展開されすにエコーバックされます。 2 番目の形式では、シェルは読み込んだコマンド行をそ のまま標準工ラー出力にエコーバックします。 -x を使うと、プログラム中の変数に代入されている値な どか調べられます。また、一 v ではプログラムがどこで終了 してしまったかなどか調べられます。次の例を見てくださ 5 echo doushite 4 echo $a [ 3 ] 3 echo $a[l] 2 set a = ( 舐 0 bfo) 1 # ! /bin/csh % cat ーⅡ sample し、 % sample Subscript out of % csh -x sample set a= ( 0 bfo echo- 0 0 Subscript out of % csh —v sample set a= ( afo bfo echo $a [ 1 ] 0 e 0 $a [ 3 ] Subscript out of ra.nge . ra.nge . range ・ sample では 4 行目で変数の使い方を間違った ( 変数 a には 2 つの値しか代入していないのに、 3 番目の値を使お うとした ) ので、プログラムの実行は 4 行目で終了します。 sample だけで実行すると、、 Subscript out 0f range" と いう簡単なエラーメッセージが出力されるだけで、いった いどこが悪いのかさつばり分かりません ( この程度のプロ グラムなら比較的簡単に分かりますが、長くて複雑なプロ グラムの場合は検出が難しくなります ) 。そこで、 -x を使 いました。 echo afo が実行されて afo がエコーバックさ れた後、エラーメッセージが表示されています。そこで、 echo afo の行 ( 3 行目 ) 以降がおかしいということが分か りますね。一方、一 v では echo $ [ 3 ] がエコーバックされ た後でエラーメッセージが表小されていますから、この行 の置換えに失敗してシェルが終了したことがはっきりと分 かります。 このように、、、シェルプログラムがうまく動作しないハ、ェ ラーとなって終了する〃などの場合は、一 v やー x オプション を付けて C シェルを直接起動し、原因を調べるとよいでし シェルプログラム自身には何も問題がないのに、思った ようにプログラムか動作しないという場合もあります。 のようなときは、 . cs c の記述に原因があるのかもしれま せん。 . cs c は、 C シェルが起動されるたびに実行されま す。もし . cshrc の内容に原因があるのかな ? と思ったら、 csh -V プログラム名 csh -X プログラム名 などを実行してみましよう。 -V と -X を付けると、 . cshrc を実行している様子も表示されます。この点を除けは、そ れぞれの働きは一 v と -x と同しです。 今回は、シェルプログラムで使うと便利なファイル名の モディファイア、 goto/break/continue などシェルプロ グラムの実行をどこかの行に飛ばすコマンド、 onintr コマ ンドを用いた強制終了の場合の処理、シェルプログラムに おける一時ファイルの作成方法、終了ステータスとその利 用方法、シェルプログラムがうまく動かない場合の原因の 調べ方、などを説明しました。 C シェルプログラムの書き 方についての説明は今回で終了です。次回からは、 ( 前回に もお約束した ) Bourne シェルプログラムの書き方につい て紹介する予定です。次号から 2 ~ 3 回にわたって B シェ ルの説明をし、この連載を終りたい・ j : だめ、だめ、だめえええっ ! まだ紹介していない機能が いつばいあるでしょっ ! ( さかもと・あや ) VO し . 5 # 11 UNiX MAGAZINE 四 90 年Ⅱ月号 ( 通巻 49 号 ) 円 90 年Ⅱ月一日発行 発行人・塚本慶一郎編集人・大久保讓治 Editor's Network Address: unixmag@ascii. co.jp 発行所・株式会社アスキー〒 97 ー 24 東京都港区南青山 6- Ⅱョスリーエフ南青山ビル電話 03 ー 486 ー引Ⅱ振替東京 4 ヨ 6 Ⅱ 44 ■ 焚車云載◎四 90 ASCII Corporation 160 田 790 Ⅱ UNIX MAGAZINE 1990.11
これは、 vi ( や ex ) がその実行中だけ一時的に作っている 一時ファイル〃です。ファイル名の先頭には Ex や Rx が 付いていますが、その後ろにはⅵに与えられたプロセス識 別子が使われています ( 最後に実行した ps コマンドの結 果を参照してください ) 。このように、 UN IX のコマンド のなかには、実行時に一時ファイルを作り、そのなかに必 要なデータを書き込んでおくようなものがあります。 シェルプログラムの実行時にも、これと同様に一時ファ イルが作れます。このファイルは、通常は一日勺なファイ ルを作るためのディレクトリ /frnp ( または /usr/tmp な ど ) に作成します。このとき、特定のファイル名を使って一 時ファイルを作ることもできます。しかし、それでは複数 のユーザーが同時にそのシェルプログラムを実行すると、 同名のファイルに同時に書き込まれるなどの問題が生して しまいます。そこで、そのような事態を回避するために UNIX では一時ファイルの名前にはそのファイルを作る プロセスのプロセス識別子を使う習慣になっています。各 プロセスには、重複のない一意なプロセス識別子が割り当 てられます。したがって、ファイル名にプロセス識別子を 使えば、たとえ複数のユーサーが同時にそのシェルプログ ラムを実行してもファイル名の重複が起こることは ( はば 皆無といってよいほど ) ありません。 IJN Ⅸへの招待⑩ シェルプログラムでプロセス識別子を利用した一時フ ァイルを作るには、そのプログラムを実行しているシェル のプロセス識別子を得なければなりません。プログラムの なかで ps コマンドでも実行すればいいのかしら ? いえ いえ、そんな面倒な操作をしなくても簡単な方法でプロセ ス識別子が得られます。 $ $ を使えばよいのです。次の例を 見てください。 % echo $ $ 196 % cat sample # ! /bin/c sh echo $ $ % sample 199 % sample 202 シェルは、メタキャラクタ $ に引き続いて $ ( つまり $ $ ) を 検出すると、その部分を自身のプロセス識別子と置き換え ます。上の例では、最初に実行した echo コマンドでログイ ンシェルのプロセス識別子が、 sample の実行では sam- ple を実行しているシェルのプロセス識別子がエコーバッ クされています。このように、シェルのプロセス識別子は $ $ によって利用できます。 一時ファイルの名前 さて、話を一時ファイルに戻しましよう。一時ファイル には、 ( シェルのプロセス識別子だけでもかまいませんが ) どのコマンドがそのファイルを作成したかを明確にするた めにコマンド名やコマンド名の一部も利用します。また、 一時ファイルはコマンドの実行中だけに必要なファイルで % cat ーⅡ seikyu 1 2 3 4 5 6 7 8 9 10 11 12 156 # ! /bin/csh 0 1 Ⅱ remove message : echo ー " 何か入力してください = > " set input=$ く echo $input > /tmp/${0}$$ echo " 入力されたのは " cat /tmp/${0}$$ echo ーⅡ " です。よろしいですか ? ( y / n ) if ( $ く ! = y ) goto message remove : すから、シェルプログラムの最後で削除するよう心がけて ください。また、プログラム中には、、強制終了時には一時 ファイルを消してからプログラムを終了する〃という処理 を記述しておいたほうがよいでしよう。 UNIX MAGAZINE 1990.11
シェルプログラムの実行は、強制終了のキー (CTRL-C など ) を使用して強制的に終了させることができます。ま た、シェルプログラムのなかでは、強制終了させられたと きに、、このコマンドだけは実行してからプログラムを終了 する〃という処理が可能です。それには、プログラム中に 次のように記述します。 omntr label label : 強制終了させられるときの処理 一般に、 onintr label の行はプログラムの先頭部分に書 きますが、もちろんプログラムの途中に記述してもかまい ません。シェルは、 onintr label の行を読み込んだ時点 で、、、強制終了の指示があったら label の部分に実行を移 す〃と記憶します (onintr は、シェルが読み込んた畤点です ぐに実行されるわけではないという点を除いて goto とよ く似ています ) 。そして、実際に強制終了の指示が来たら 、、 label : 〃の次行からファイルの最後までを実行して終了し ます。次のプログラムを実行し、強制終了してみましよう。 IJN Ⅸへの招待⑩ シェルプログラムを強制終了したら ? echo 0 制終了のまぐがあったらプログラムのどの部分に実行を移 すかを記述できます。また、強制終了のときに実行が移る ラベルは ( そこからファイルの最後までが実行されるた め ) ファイルの最後の部分に記述しておきます。 前述したように onintr は goto とよく似ています。事 実、 onintr の飛び先として記述する label の行は、シェル にとっては goto の飛び先と同したんなるラベルにすぎま せん。したがって、シェルプログラムの最後に記述する強 制終了時の処理は、たとえ強制終了させられなくても実行 されてしまいます。次の例を見てください。 % cat ー sample 1 # ! /bin/csh 2 onintr oshimai 3 4 oshimal : horane % sample 5 echO horane ech0 j ikkousarerudesyo % cat 1 2 3 4 5 6 7 -n sample # ! /bin/csh onintr 0 shimax oshlmax : end while(l) echO Oshimai % sample 0 AC Oshimai 154 が終了します。このように、シェルプログラム中には、強 強制終了の指示があると、 7 行目が実行されてプログラム す。また、 6 行目では実際にそのラベルを定義しています。 oshimai のラベルの部分に実行を移す〃と宣言していま この例では、 2 行目で、、強制終了の指示があったら 」 ikkousarerudesyo この例では 4 行目以降に強制終了のための処理を記述 していますが、プログラムを実行すると 5 行目のコマンド も実行されています。 正常に終了したときでも、強制終了させられたときでも label 以降のコマンド ( 上の例では 5 行目 ) を実行するのな らば、このように書いておいてもかまいません。しかし、 正常に終了する場合は強制終了時の記述を実行したくな い場合は、 exit oshimai : echo lntterrupt と、 label の前に exit コマンドを言己しておきます。 強制終了を受け付けない UN Ⅸのコマンドのなかには、強制終了を受け付けない ものがあります。これと同しように、シェルプログラムで も強制終了を受け付けないようにすることができます。 の場合は、 onintr コマンドを次のように使います。 UNIX MAGAZINE 1990.11
IJN Ⅸへの招待⑩ 8 9 10 11 12 13 14 15 16 end case echO exit e ChO echO def ault : " フ。ログラムを終了します " " おかしな号が人力されました " " もう 1 度人力し直してください " endsw cont inue 17 echo " 人力された番号は $ { input } です " % sample 番号を人力してください = > 1 入力された番号は 1 です % sample 番号を入力してください = > 0 おかしな番号が人力されました もう 1 度人力し直してください 番号を入力してください = > 1 入力された番号は 1 です % sample 番号を入力してください = > ← return のみを入力 プログラムを終了します 2 行目の while では括弧内の条件式で 1 を指定し、永久 に終らないループを作っています。 5 行目の switch では、 入力された数字によって異なる処理をしています。 0 から 9 までのいすれか 1 文字 ( 6 行目 ) の場合は、 break で while に対応する end 以降に実行を移します。また、なに も入力されない ( ヌル ) 場合 ( 8 行目の case で判定 ) には、 exit を使ってプログラムを終了します。以 E のいすれでも ない場合 ( 11 行目の default:) は、 2 行のメッセージを出 力し、再度番号の入力を促すために continue で while の 先頭 ( 3 行目 ) に実行を移します。 ごく簡単な例でしたが、 continue と break の使い方は 分かりましたか ? continue では現在のループの先頭に 実行が移りますが、 break では現在のループの外側に実行 が移ります。今度は、 break コマンドについて次のような ケースを考えてみましよう。 り、入れ子になったループで break を使った場合は、その break を記述しているループの外側に実行が移るだけな のです。内側のループで使えば内側のループから、外側で 使えば外側のループから抜け出ます。 1 回の break コマ ンドで、内側のループからいきなり外側のループの外に抜 け出ることはできません。 ただし、ちょっとおもしろい操作ができます。 1 while(l) 2 3 4 5 6 end break;break com田idー 1 while(l) end 1 while ( 2 3 4 5 6 co 皿 n 田 id ー 2 7 end break command— end while( 1 こでは、ループのなかでさらにループを員己していま 行目の break によって実行が移るさきは 6 行目です。つま すにれをヾ入れ子のルーアと呼びます ) 。このとき、 4 152 7 comm id ー 2 内側のループでは、シェルのコマンド同時入力機能 ( ; ) を使って break を 2 つ記述しています。このように書い UNIX MAGAZINE 1990.11 ます。当り前のような気もしますが、これはシェルのちょ プも抜け出ることになり、コマンドの実行は 7 行目に移り の break を実行してしまうのです。この結果、外側のルー ( 5 行目 ) に出た後、読み込んでまだ実行していない 2 つ目 3 行目を読み込み、最初の break を実行してループの外 読み込んだ 1 行のコマンドをすべて実行します。ですから、 り、外側のループまで抜け出られるわけです。シェルは、 ではなく、 7 行目の command ー 2 が実行されます。つま ておくと、 3 行目の最初の break が実行された後、 5 行目
処理をする、というケースがないとはいえません。たとえ ば、 if ( $ # 矼空く 1 ) then echo "Usage : $ 0 filename" exit 1 UN Ⅸへの招待⑩ endif など、問題があってシェルプログラムを終了するために exit を使う場合には、それなりの終了ステータスを返すよ うに心掛けましよう。 シェルプログラムはどこで終るか こでは、シェルプログラムの終了について考えてみま す。もちろん、シェルプログラムはプログラムを記述して いるファイルの最後に達すると終了します。これは、いわ ゆる正常終了です。また、 exit コマンドが記述されている 部分で終了することもあります。一方、以上のいすれでも なく、ファイルの最後まで実行せすにシェルプログラムが 終了する場合もあります。 % cat ーⅡ sample 1 # ! /bin/csh 2 echo $nai 3 while(l) 4 5 end echo 舐 0 このプログラムを実行してみましよう。 % sample nai: Undefined variable . 2 行目の echo コマンドでは、定義されていない変数を 使っています。そこで、シェルは ( $ nai を置き換えること ができす )Undefined variable というエラーメッセージ を表示し、残りの部分を実行せすに終了しています。 これからも分かるように、シェルは次のような場合にシ ェルプログラムの実行を終了します。 I) 変数の置換えができない 定義されていない変数を使用した。 2 ) 組込みデータの誤った言当 3 ) @の誤った記述 がない。 EOF cat くく EOF などの場合に、系ムみデータの終了を示す EOF の記述 ラムが終了することはありません。 など、コマンド自体の実行が異常終了してもシェルプログ ・コマンドの置換 ( つが不可能 ・コマンドの異常終了 it—then—endif で endif を書き忘れた場合など。 4 ) 組込みコマンドの誤った記述 @で始まる行の各演算子のあいだに空白がない場合など。 うまく動かないときは ? シェルプログラムを作成していざ実行してみると、前述 のような問題によって実行が途中で終ってしまったり、期 待どおりの結果が得られない場合があります。 そのようなときには、シェルプログラムを次のような形 式で実行すると比較的簡単に原因をつきとめることがで UNIX MAGAZINE 1990.11 きます。 csh -x プログラム名 csh -v プログラム名 最初の形式の場合、シェルはプログラムの各行を読み込み、 そこで使用されているメタキャラクタを置き換えた後でコ マンドを実行する直前にその行を標準工ラー出力にエコー 159
IJN Ⅸへの招待⑩ っとした、、からくり〃かもしれません。 という形式で記述しておき、 goto コマンドを、 goto goto label 次に、 goto コマンドについて勉強しましよう。 goto という形式で使用します。この goto コマンドが実行され は、プログラムの特定の部分〃に実行を移すコマンドで ると、プログラムの実行は label を書いた行に移ります。 す。特定の部分にはラベルを、 そして、 label の次の行から記述されているコマンドが実 行されます。 label: % cat ーⅡ sample 1 # ! /bin/csh 2 set ans=(1 2 3 ) 3 haj imem : echo ーれ " 何か人力してください = > " 4 set ans [ 1 ] = $ く 5 e ・ cho ーⅡ " もういちど何か人力してください = > " 6 set ans [ 2 ] = $ く 7 echo ーれ " またまた何か人力してください = > " 8 set ans [ 3 ] = $ く 9 echo " お答は $ 田 as " 10 echO ーⅡ " これでいいですか ? = > " 11 if ( $ く = Ⅱ ) goto haJ imeni 12 % sample 何か人力してください = > 0 もういちど何か人力してください = > bfo またまた何か入力してください = > cfo お答は 0 bfo cfo これでいいですか ? = > れ 何か入力してください = > aya もういちど何か人力してください = > ss またまた何か入力してください = > minmin お答は aya ss minmln これでいいですか ? = > y この例では、 12 行目 ( の $ く ) で n が入力されると goto コマンドが実行され、シェルプログラムの実行はラベルが 言己されている 3 行目に移ります。そして、再度 4 行目か らしてあるコマンドの実行がおこなわれます。 ラベルは、 label : など、 goto コマンドが記述してある行の前方でも後方で も、シェルプログラムのなかでありさえすればどこに してもかまいません。 また、 goto コマンドの引数で指定するラベルにメタキャ ラクタが使用されていると、シェルはそれを展開してラベ ルとして利用します。たとえは、 1 set label=aya 2 aya: 3 4 goto $label というプログラムでは、 4 行目で変数 label の値 ( aya ) が 置き換えられた後に goto コマンドが実行されるので、プ ログラムの実行は 2 行目に移ります。 goto label や、 goto label label : 153 UNIX MAGAZINE 1990.11
このコマンドを書いておけば、強制終了しようとしても シェルプログラムは終了しません ( この場合、飛び先のラベ ルは不要です ) 。 プログラムのある部分を実行しているときだけ強制終了 を受け付けたくないという場合には、ある部分の実行が始 まる前に "onintr ー〃と、その部分が終了する後に % nintr omntr % ls ー 1 /tmp co IW co S co S ・ 03 uwm p0 T ・ 00 ps % cat ー sample label" と記述しておきます。 1 2 3 4 5 6 7 8 9 10 11 # ! /bin/csh onintr 0 1 Ⅱ ok : echo sleep sleep 10 echO OW 1 ok ⅶ 11e ( 1 ) echo 舐 0 end echo interrupt % sample sleep IJN Ⅸへの招待⑩ 0 矼 1 0 0 舐 0 AC interrupt% このプログラムでは、 2 行目に "onintr ー〃を記述して います。シェルは、この行を読み込んた畤点から強制終了 を受け付けなくなります。 3 ~ 5 行目の実行が終了するとシ ェルは 6 行目を読み込み、強制終了させられたときはラベ ル。 k 以降に実行を移すと記憶します。このため、 7 ~ 9 行 目を実行しているあいだは強制終了が受け付けられます。 このように、同しシェルプログラムのなかでも、実行して いる部分によって強制終了に対する処理をいろいろと変え ることができるのです。 onintr コマンドについて説明してきましたが、現実には 強制終了の際にどのようなことを実行すべきかはケースパ イケースです。通常は、プログラムの実行にあたって作成 した一時的なファイルを消したり、、、強制終了させられまし た〃などのメッセージを表示するといったところでしよう シェルプログラムにおける一時ファイルの作成 工デイタ ( vi や ex など ) を使っている途中で CTRL ー Z を用いてエデイタを一時停止し、 ls ー 1 コマンドでディレ クトリ / tmp のなかを覗いてみてください。そこには、以下 のように Ex や Rx で始まる名前の ( 自分の所有物であ る ) ファイルがあるはすです。 % vi t Ota1 57 % ps 96 97 98 106 188 CTRL-Z で一時停止 PID ・ STAT 102 co 工 104 p0 S p0 191 p0 R 47104 Sep 9 01 : 24 EX00188 10240 Sep 9 01 : 22 RX00188 TIME COIOIAND ー Xdt xinit 6 : 48 Xdt : 0 ・ 10 wtenn ー 1 euc —geometry 90X30 + 20 + 20 -j s localhost 1 aya 1 aya I ・ 00 0 . 0 . 0 . 2. 0. 0 : 03 vi invtll . tex 0 : 00 xclock ・ 07 -sh (/bin/csh) 一時停止しているⅵ UNIX MAGAZINE 1990.11 155
実行してみると、 % csh /tmp/samp1e2 4 となります。どうやら、さきほどの推測は当たっている ようてす。では、もうすこし過激に次のスクリフ。トを実 行してみましよう。 ワークステーションのおと・一 " 2 ー 2 " 5 4 echo e nd 7 echo " 7 " 6 end 7 % csh /tmp/samplel これを実行してみると、 break の後にそれそれの while から抜け出すときのあ どんなコマンドに置き換えてもいいはすです。すると、 となって、それらしし、です牙ここで、 echo の部分は べてみましよう。 ということは g 。 t 。でも同じ状況なのでしようか。調 goto 、 exit と始末を書いたりできるのです。うーん、便利。 1 echo 2 echo 3 XXXX : 4 echo " 1 ー 1 " ; goto XXXX; echo " 1 ー 2 " % csh /tmp/samp1e2 1 となり、 ex 土 t の後のコマンドも実行されるようで。 % csh /tmp/samp1e3 これよ、 goto XXXX; echo " 2 ー 3 " exit; echo " 2 ー 2 " ・ \ 2 echo " 2 ー 1 " ・ 1 XXXX: さらに、次のスクリプトを実行してみます。 3 ACAC となって、無限ループになるのてすれ では・・・ これ以上は読者の皆さんのお楽しみとし 1 e c れ 0 " 1 " 2 echo " 2 ー 1 " これよ、 72 exit ; echo ておきましよう。調べてみると、 C シェルはいろいろ と変なことができそうです。 続々・ハードティスク 9 ~ 10 月号でハードディスクについて説明してきま した。今月・もまたその続きてす 2 。 外形寸法 このハードディスクの寸法は、 2 詳しくは、 1990 年 9 ~ 10 月号の「ワークステーションのおと」を 見てください。 UNIX MAGAZINE 1990.11
さきはど書いたように、 : r ではサフィックスの部分 ( 最後 の、ソ以降 ) がすべて取り除かれますから、上の例では XXX. 01d というファイル名を XXX に変更できたわけ です。 話はすこし逸れてしまいますが、 if—then—endif や while— end 、 foreach—end などのコマンドは、 set や echo などと同しようにシェルの組込みコマンドです。し たがって、これらのコマンドも通常のコマンド入力行で使 えます。 ただし、 "foreach を使った後はかならず end を使わな ければならない〃、、 if では endif が必要′′など、これらを使 うには複数行にわたるコマンド入力が必要です。そのため シェルは、 foreach/while や if などのコマンドが入力さ れると、 % while ( 1 ) > 1 内 . > end active aya active aya act ive aya Ⅱ 0 entries Ⅱ 0 entries Rank 0wner Rank 0wner Rank Owner Job 518 Job 518 Job 518 Fi1es genko. dvi Fi1es genko. dvi Fi1es genko . dvi プリンタにファイルを出力したら、こんなふうにコマン ドを実行してみたらどうでしよう ? 上の例では while ( 1 ) で永久に終らないループを作って IJN Ⅸへの招待⑩ というプロンプトを表示し、引き続き入力が必要であると 知らせますにのようなプロンプトのことを、 Bourne シェ ルでは 2 次プロンプトと呼ぶようです ) 。 前の例では、プロンプト〉のところで mv コマンドを入 力し、次の行では end を入力しています。この場合、シェ ルは foreach に対応する end が入力された時点で、 for- each から end までのあいだに挟まれたコマンドの実行を 開始します。 これらの組込みコマンドをコマンド行で使えば、シェル プログラムを作らなくても ( さほど複雑ではない ) 条件を 判断しながらのコマンド実行や、コマンド実行の繰返しな どがおこなえます。 Tota1 Size 22180 Tota1 Size 22180 Tota1 Size 22180 し ) CTRL ー C ) を使ってコマンドの実行を強制終了してくださ 、ゝいますが、必要がなくなったら強制終了のキーにこでは あっちこっちにフーラフラ こでは、 break 、 continue 、 goto という 3 つの組込のあいだでしか使えません。 break は while や foreach みコマンドを紹介します。 break と continue break と continue は、 while— end か foreach— end % cat —n sample 1 # ! /bin/csh 2 while(l) のループから抜け出る、 continue は while や foreach の ます、簡単な例を見てみましよう。 ループの先頭へ戻るというコマンドです。 3 4 5 6 7 e ChO ーⅡ " 番号を人力してください = > " set input=$ く switch ($input) case [ 0 ー 9 ] : break UNIX MAGAZINE 1990.11 151