前へ | 次へ | 目次 | 索引 |
値を変数に割り当てるには,多くの方法があります。この節では,INQUIRE コマンドの使い方について説明します。他の方法については,第 14 章 を参照してください。
値を変数に割り当て,条件をテストするには,次の操作を実行します。
手順 | 操作 |
---|---|
1 | INQUIRE コマンドを使用して,値を変数に割り当てる。 |
2 | 実行しなければならない処理を判断する。 |
3 | IF 文と THEN 文を使用して条件をテストする。 |
4 | プログラム・スタブを作成し,コマンドのプレースホルダとしてコマンド・プロシージャに挿入する。 |
5 | 必要に応じてエラー・メッセージを作成する。 |
INQUIRE コマンドは,値を要求するプロンプトを表示し,ターミナルから値を読み込み,その値をシンボルに割り当てます。
省略時の設定では,INQUIRE コマンドは次の操作を実行します。
次の例は,コマンド・プロシージャCLEANUP.COM の中でコマンド名の入力を求めるコマンドです。INQUIRE コマンドは入力された値をシンボル COMMANDに割り当てます。
$ INQUIRE COMMAND- "Enter command(DELETE, DIRECTORY, PRINT, PURGE, TYPE)" |
INQUIRE コマンドを使用するときに,小文字や複数のスペースとタブを保存するには,応答を引用符(" ")で囲みます。応答の内部で引用符を使用するときは,引用符で囲んだテキストを引用符で囲みます(""text"")。
13.5.2.3 IFとTHENを使用した条件のテスト
INQUIRE コマンドで変数を要求するプロンプトを表示した後,どのような処理を実行するかを判断する文をコマンド・プロシージャに指定しなければなりません。たとえば,どのコマンドを実行するかを判断するには,ユーザが入力したコマンドを可能な各コマンドに対してチェックする文を,コマンド・プロシージャに指定しなければなりません。
条件が真であるかどうかをテストするには,IF コマンドと THEN コマンドを使用します。次の表は,CLEANUP.COM でチェックしなければならない可能性を示しています。
場合 | 結果 |
---|---|
一致するものが見つかった場合 | コマンドを実行する |
一致するものが見つからない場合 | 次のコマンドに進む |
有効なすべてのコマンドをチェックした後,一致するものが見つからない場合 | エラー・メッセージを出力する |
プログラム・スタブ とは,設計をテストするときに,プロシージャで使用する一時的なコード・セクションです。通常,プログラム・スタブは,そのスタブのかわりに実際に使用される機能を示すメッセージを出力します。全体の設計が正しく動作することを確認した後は,各スタブを正しいコーディングに置き換えます。
次の例では,変数の割り当てと条件のテスト方法を示しています。
$ INQUIRE COMMAND- "Enter command(DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE)" $ IF COMMAND .EQS. "EXIT" THEN EXIT $! $! Execute if user entered DELETE $ DELETE: $ IF COMMAND .NES "DELETE" THEN GOTO DIRECTORY (1) (2) $ WRITE SYS$OUTPUT "This is the DELETE section." (3) $! Execute if user entered DIRECTORY $ DIRECTORY: (4) $ IF COMMAND .NES "DIRECTORY" THEN GOTO PRINT $ WRITE SYS$OUTPUT "This is the DIRECTORY section." . . . $! Execute if user entered TYPE $ TYPE: $ IF COMMAND .NES "TYPE" THEN GOTO ERROR (5) $ WRITE SYS$OUTPUT "This is the TYPE section." $! $ ERROR: $ WRITE SYS$OUTPUT "You have entered an invalid command." (6) $! $ EXIT |
例を確認するときは,次のことに注意してください。
ループとは,条件が満足されるまで繰り返し実行される文の集まりです。ループは次のように機能します。
ループを作成するには,次の手順を実行します。
手順 | 操作 |
---|---|
1 | ループの先頭にラベルを付ける。 |
2 | 変数を調べて,ループの中のコマンドを実行する必要があるかどうかを判別する。 |
3 | ループを実行する必要がない場合には,ループの終わりに進む。 |
4 | ループを実行する必要がある場合には,ループ本体の中のコマンドを実行してから,ループの始めに戻る。 |
5 | ループを終了する。 |
次の例では,CLEANUP.COM コマンド・プロシージャでのループの使い方を示しています。
$ GET_COM_LOOP: $ INQUIRE COMMAND- $ "Enter command(DELETE, DIRECTORY. EXIT, PRINT, PURGE, TYPE)" $ IF COMMAND .EQS. "EXIT" THEN GOTO END_LOOP $! $! Execute if user entered DELETE $ DELETE: $ IF COMMAND .NES. "DELETE" THEN GOTO DIRECTORY $ WRITE SYS$OUTPUT "This is the DELETE section." $ GOTO GET_COM_LOOP . . . $ END_LOOP: $ WRITE SYS$OUTPUT "Directory ''F$DIRECTORY()' has been cleaned" $ EXIT |
コマンドを実行した後,ユーザが EXIT コマンドを入力するまで,制御は GET_COM_LOOP ラベルに戻されます。EXIT コマンドが入力されると,プロシージャはディレクトリが整理されたことを示すメッセージを出力します。
13.5.4 手順 4: コマンド・プロシージャを終了する
コマンド・プロシージャを終了するには,次の手順を実行します。
手順 | 操作 |
---|---|
1 | どこでコマンド・プロシージャを終了するかを判断する。 |
2 | 必要に応じて EXIT または STOP コマンドを指定する。 |
コマンド・プロシージャで EXIT コマンドを使用すると,次のことが可能になります。
次の例は,プロシージャの最後に指定されているエラー処理ルーチンを実行しないようにするために,EXIT コマンドを使用する方法を示しています。
. . . $ EXIT ! End of normal execution path $ ERROR_ROUTINE . . . |
次の例は,複数の実行パスを持つプロシージャを終了するために,EXIT コマンドを使用する方法を示しています。
$ START: $ IF P1 .EQS. "TAPE" .OR. P1 .EQS. "DISK" THEN GOTO 'P1' $ INQUIRE P1 "Enter device(TAPE or DISK)" $ GOTO START $ TAPE: !Process tape files . . . $ EXIT $ DISK: ! Process disk files . . . $ EXIT |
各ラベル(TAPE と DISK)の後のコマンドは,プロシージャで異なるパスを与えます。DISK ラベルの前の EXIT コマンドは,プロシージャがそのラベルに明示的に分岐した場合を除き,DISK ラベルの後のコマンドが実行されないようにします。
プロシージャの最後に EXIT コマンドを指定する必要はありません。これは,プロシージャのエンド・オブ・ファイルにより,暗黙に EXIT コマンドが実行されるからです。しかし,なるべく EXIT コマンドを指定するようにしてください。
13.5.4.2 STOP コマンドの使用
コマンド・プロシージャで STOP コマンドを使用すると,重大なエラーが発生したときに,プロシージャを終了することができます。会話形式で実行されているコマンド・プロシージャで STOP コマンドを使用した場合には,制御は DCL レベルに戻されます。バッチ・モードで実行されているコマンド・プロシージャの場合には,バッチ・ジョブが終了します。
このコマンド行は,重大なエラーが発生したときに,プロシージャを停止するように要求します。
$ ON SEVERE_ERROR THEN STOP |
13.5.5 手順 5: プログラム・ロジックをテストおよびデバッグする
プログラム・スタブを使用してコードを作成した場合には,コマンド・プロシージャの全体的なロジックをテストしなければなりません。可能性のあるすべての実行パスをテストしなければなりません。
コマンド・プロシージャをテストおよびデバッグするには,次の手順を実行します。
手順 | 操作 |
---|---|
1 | コマンド・プロシージャに正しい各コマンドを入力して,プログラム・ロジックをテストする。 |
2 | 誤ったコマンドを入力して,プログラム・ロジックのテストを継続する。 |
3 | EXIT コマンドを使用して,コマンド・プロシージャを終了することにより,プログラム・ロジックのテストを終了する。 |
4 | 必要な場合には,SET VERIFY,SET PREFIX,SHOW SYMBOL コマンドを使用して,プログラムをデバッグする。 |
次の例では,可能な各コマンドと無効なコマンドを入力および実行して,コマンド・プロシージャをテストし,最後にプロシージャを終了する方法を示しています。
$ @CLEANUP Enter command(DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE): DELETE This is the DELETE section. Enter command(DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE): DIRECTORY This is the DIRECTORY section. . . . Enter command(DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE): PRINF You have entered an invalid command. Enter command(DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE): EXIT $ |
次のコマンドは,コマンド・プロシージャをデバッグするのに役立ちます。
実行する前に各行を表示する。チェック設定でエラーが発生した場合には,そのエラーと,エラーを生成した行が表示される。SET VERIFY コマンドでは,コマンド行だけをチェックするのか,データ行もチェックするのかを指定するために,キーワードを使用できる。
SET VERIFY コマンドは,ログアウトするまで,SET NOVERIFY コマンドを入力するまで,または F$VERIFY レキシカル関数を使用してチェック設定を変更するまで有効である(チェック設定の変更についての詳しい説明は,第 15 章 を参照)。
チェック機能が有効な場合には,DCL コマンド SET PREFIX を使用し,各コマンド行の前に,そのコマンドが実行された時刻を挿入することにより,プロシージャ・ログ・ファイルにタイム・スタンプを出力できる。
SHOW SYMBOL コマンドを使用すれば,プロシージャ内のシンボルがどのように定義されているかを判断できる。
次の例では,END_LOP というラベルの綴りが誤っています。チェック機能が有効に設定されているため,エラーがどこで発生したのかを正確に判断できます。
$ SET VERIFY $ @CLEAN $ GET_COM_LOOP: $ INQUIRE COMMAND - "Enter command(DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE)" Enter command(DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE): EXIT $ IF COMMAND .EQS. "EXIT" THEN GOTO END_LOP %DCL-W-USGOTO, target of GOTO not found - check spelling and presence of label |
エラーを修正するには,ラベルを END_LOOP に変更します。
次の例ではタイム・スタンプの使い方を示しています。
$ SET VERIFY $ @TEST $ SET DEFAULT SYS$LOGIN $ SHOW DEFAULT USER$:[SMYTHE] $ SET PREFIX "(!5%T)" $ @TEST (17:52) $ SET DEFAULT SYS$LOGIN (17:52) $ SHOW DEFAULT USER$:[SMYTHE] |
次の例では,SHOW SYMBOL コマンドを使用して,シンボル COMMAND がどのように定義されているか判断する方法を示しています。
$ SET VERIFY $ @CLEAN $ GET_COM_LOOP: $ INQUIRE COMMAND - "ENTER COMMAND(DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE)" ENTER COMMAND(DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE): EXIT $ SHOW SYMBOL COMMAND COMMAND = "EXIT" $ IF COMMAND .EQS. "exit" THEN GOTO END_LOOP . . . |
SHOW SYMBOL コマンドを実行すると,シンボル COMMAND の値が "EXIT" であることがわかります。INQUIRE コマンドは入力を大文字に自動的に変換しますが,コマンドをテストする IF 文では,文字列 "exit" で小文字を使用しているため,DCL は文字列が等しくないと判断します。このエラーを修正するには,IF 文に指定した,引用符で囲んだ文字列を大文字にします。文字列の残りの部分は,大文字でも小文字でもかまいません。
13.5.5.2 実行中にチェック機能をオンにする
コマンド・プロシージャの実行中に割り込みをかけて,チェック機能を有効にすることもできます。コマンド・プロシージャに SET VERIFY コマンドや Ctrl/Y キー・シーケンスが含まれていない限り,次の操作を実行して,チェック機能を有効に設定できます。
手順 | 操作 |
---|---|
1 | Ctrl/Y を押して実行に割り込みをかける。 |
2 | SET VERIFY コマンドを入力する。 |
3 | CONTINUE コマンドを入力して,コマンド・プロシージャの実行を続行する(チェック機能を有効にした状態で)。 |
一般に,コマンド・プロシージャを実行した結果,ユーザのプロセス状態が変化しないようにしなければなりません。したがって,コマンド・プロシージャには,プロセスをもとの状態に戻す一連のコマンドを指定しなければなりません。このコマンドは通常,"CLEAN_UP" というラベルの付いたサブルーチンの一部です。一般的なクリーンアップ操作としては,ファイルを閉じる操作と,省略時のデバイスおよびディレクトリをリセットする操作があります。
コマンド・プロシージャにクリーンアップ・タスクを追加するには,次の操作を実行します。
手順 | 操作 |
---|---|
1 | CLEAN_UP などのラベルを使用して,クリーンアップ・サブルーチンを開始する。 |
2 | F$GETJPI レキシカル関数を使用して,開かれているファイルがあるかどうかテストする。 |
3 | DELETE コマンドまたは PURGE コマンドを使用して,一時ファイルまたは余分なファイルを削除する。 |
4 | (デバイスやディレクトリなど)省略時の設定を変更した場合には,SET DEFAULT コマンドを使用して,元の状態に復元する。 |
5 | クリーンアップ操作が確実に実行されるように,ON CONTROL_Y 文を指定する。 |
前へ | 次へ | 目次 | 索引 |