前へ | 次へ | 目次 | 索引 |
拡張 DCL プログラミングとは,複雑なコマノド・プロシージャと DCL コマンドの PIPE コマンドを使用することです。
複雑なコマンド・プロシージャは,プログラムと同様の機能を実行できます。コマンド・プロシージャでは,変数入力を使用でき,特定の条件が真のときにだけプロシージャのセクションを実行でき,サブルーチンを実行したり,他のコマンド・プロシージャを起動することができます。
DCL の PIPE コマンドも,プログラムと同様の機能を実行できます。たとえば PIPE コマンドを使用すると,同一 DCL コマンド行から,次に示す 1 つまたは複数の操作を実行できます。
本章では,次のことについて説明します。
本章は次の方を対象にしています。
その他の情報については,次のものを参照してください。
コマンド・プロシージャでは,ユーザが提供するデータを必要とすることがよくあります。このデータ,つまり入力は会話形式で入手でき( 第 15 章 を参照),非会話形式で入手することもできます。本章では,非会話型入力方式について説明し, 第 15 章 で説明していない会話型入力方式についても説明します。
コマンド・プロシージャを実行するたびに,同じデータを使用できます。同じデータを使用するには,コマンド・プロシージャでデータを必要とするコマンドの後のデータ行にデータを指定します。
次のコマンド・プロシージャは, CENSUS.EXE コマンド・プロシージャを実行します。 CENSUS.EXE はプロシージャが実行されるたびに 1993,1994,1995 のデータを読み込みます。
$ ! CENSUS.COM $ ! $ RUN CENSUS 1993 1994 1995 $ EXIT |
16.1.1 コマンド・プロシージャにデータを登録する場合の制限事項
DCL は,データ行に指定されたテキストをコマンド・プロシージャに直接渡します。したがって,次に示すように,変換しなければならないデータは処理されません。
この後の節では,次に示すように,コマンド・プロシージャに対する入力データを入手するための別の方法について説明します。
コマンド・プロシージャにデータとしてパラメータを渡す場合には,次のガイドラインに従ってください。
DCL はローカル・シンボル P1〜P8 を使用して,パラメータをコマンド・プロシージャに渡します。 P1 には最初のパラメータ値が割り当てられ,P2 には 2 番目のパラメータ値, P3 には 3 番目のパラメータ値が割り当てられます。以下も同様です。たとえば,次のコマンドは,コマンド・プロシージャ SUM.COM を起動し, 8 つのパラメータをプロシージャに渡します。
$ @SUM 34 52 664 89 2 72 87 3 |
パラメータとして整数を指定した場合には,それは文字列に変換されます。次の例では,P1 は文字列値 24 であり,P2 は文字列値 25 です。
$ @ADDER 24 25 |
シンボル P1〜P8 は,整数式と文字列式の両方で使用できます。 DCL は必要な変換を自動的に実行します。
16.2.2 文字列としてのパラメータの指定
文字列内のスペース,タブ,小文字を保存するには,文字列の前後を引用符 (" ") で囲みます。次の例を参照してください。
$ @DATA "Paul Cramer" |
次の例では,P1 は Paul Cramer であり,P2 はヌルです。引用符を省略した場合には,各文字列は独立したパラメータとして渡されます。次の例を参照してください。
$ @DATA Paul Cramer |
この例では,文字列 Paul と Cramer が大文字に変換され,P1 は PAUL に, P2 は CRAMER になります。
もう 1 つの例として,次のコマンドで DATA.COM を起動した場合を考えます。
$ @DATA "Paul Cramer" 24 "(555) 111-1111") |
P1〜P8 は DATA.COM の中では次のように定義されています。
P1 = Paul Cramer
P2 = 24
P3 = (555) 111-1111
P4--P8 = null
シンボル値を渡すには,シンボルの前後を一重引用符で囲みます。シンボル値の内部でスペース,タブ,小文字を保存するには,値を 3 組の引用符で囲みます。文字列の一部として引用符を使用する場合には, 3 組の引用符を使用しなければなりません。
別の方法として,テキストを引用符で囲み,シンボルが表示されるときに,シンボルの前に 2 つの一重引用符を指定し,シンボルの後に 1 つの一重引用符を指定する方法があります。
次の例では,P1 は Paul であり,P2 は Cramer です。シンボルをコマンド・プロシージャに渡すときに,DCL は引用符を削除します。
$ NAME = "Paul Cramer" $ @DATA 'NAME' |
次の例では,P1 は "Paul Cramer" であり,P2 はヌルです。
$ NEW_NAME = """Paul Cramer""" $ @DATA 'NEW_NAME' |
次の例では,P1 は Paul Cramer に変換されます。
$ ! DATA.COM $ @NAME "''P1'" |
空のパラメータを渡すには,コマンド文字列の位置を表す一組の二重引用符を使用します。次の例では,DATA.COM に渡される最初のパラメータは空のパラメータです。
$ @DATA "" "Paul Cramer" |
この例では,P1 が空値で,P2 が Paul Cramer です。
16.3 バッチ・ジョブにデータを渡すためのパラメータの使用
バッチ・モードで実行されるコマンド・プロシージャにパラメータを渡すには, SUBMIT コマンドの修飾子 /PARAMETERS を使用します。
1 つの SUBMIT コマンドを使用して,複数のコマンド・プロシージャを実行する場合には,指定したパラメータは,バッチ・ジョブ内の各コマンド・プロシージャに対して使用されます。
次の例では,コマンドは, 3 つのパラメータをコマンド・プロシージャ ASK.COM と GO.COM に渡します。これらのコマンド・プロシージャはバッチ・ジョブとして実行されます。
$ SUBMIT/PARAMETERS=(TODAY,TOMORROW,YESTERDAY) ASK.COM, GO.COM) |
次の例では,SUBMIT コマンドは,2 つのパラメータをコマンド・プロシージャ LIBRARY.COM と SORT.COM に渡します。
$ SUBMIT- _$ /PARAMETERS=(DISK:[ACCOUNT.BILLS]DATA.DAT,DISK:[ACCOUNT]NAME.DAT) - _$ LIBRARY.COM, SORT.COM |
ユーザがログインして,各コマンド・プロシージャを実行したかのように,バッチ・ジョブが実行されます。この SUBMIT コマンドが実行するバッチ・ジョブは,ユーザのアカウントにログインし,ユーザのログイン・コマンド・プロシージャを実行し,その後,次のコマンドを実行します。
$ @LIBRARY DISK:[ACCOUNT.BILLS]DATA.DAT DISK:[ACCOUNT]NAME.DAT) $ @SORT DISK:[ACCOUNT.BILLS]DATA.DAT DISK:[ACCOUNT]NAME.DAT) |
データをコマンド・プロシージャの中に指定する方法, SYS$INPUT をファイルとして定義する方法でも,データをバッチ・ジョブに渡すことができます。指定されたパラメータは,バッチ・ジョブのそれぞれのコマンド・プロシージャで使用されます。
16.4 ネスティングしたコマンド・プロシージャにデータを渡すためのパラメータの使用
ネスティングしたコマンド・プロシージャに最大 8 つのパラメータを渡すことができます。ネスティングしたプロシージャでのローカル・シンボル P1〜P8 は,起動するプロシージャのローカル・シンボル P1〜P8 と関連づけられません。
次の例では,DATA.COM は,ネスティングしたコマンド・プロシージャ NAME.COM を起動します。
$ ! DATA.COM $ @NAME 'P1' Joe Cooper |
DATA.COM の P1 が Paul Cramer という文字列である場合には,この文字列引用符が含まれていないため, 2 つのパラメータとして NAME.COM に渡されます。 NAME.COM では,P1〜P8 は次のように定義されます。
P1 = PAUL
P2 = CRAMER
P3 = JOE
P4 = COOPER
P5--P8 = null
DATA.COM の P1 が "Paul Cramer" (引用符が含まれている) の場合には,次に示すように,3 組の引用符で P1 を囲むことにより, 1 つのパラメータとして値を NAME.COM に渡すことができます。
$ ! DATA.COM $ QUOTE = """ $ P1 = QUOTE + P1 + QUOTE $ @NAME 'P1' "Joe Cooper" |
この例では,コマンド・プロシージャ NAME.COM で P1 は Paul Cramer であり, P2 は Joe Cooper です。
16.5 データを要求するプロンプトの表示
コマンド・プロシージャのデータを会話形式で入手するには, INQUIRE コマンド ( 第 15 章 を参照) または READ コマンドを使用できます。どちらのコマンドも,入力を要求するプロンプトを表示し,応答をシンボルに割り当てます。
READ コマンドと INQUIRE コマンドの相違点は次のとおりです。
INQUIRE コマンド | READ コマンド |
---|---|
値を要求するプロンプト | 値を要求するプロンプト |
ターミナルから値を読み込む | 最初のパラメータによって指定されたソースから値を読み込む |
値をシンボルに割り当てる | 2 番目のパラメータとして指定されたシンボルに値を割り当てる。 |
READ コマンドは,プロンプトに対する応答としてターミナルに入力されたすべての文字を,正確な文字列値として受け付けます (大文字と小文字の区別,スペース,タブは保存されます)。 /PROMPT 修飾子を省略した場合には,READ コマンドは省略時のプロンプトとして Data: を表示します。
入力されたパラメータを受け付けることができ,また,必須パラメータが指定されなかったときに,ユーザ入力を要求するプロンプトを表示するコマンド・プロシージャを作成することもできます。
次の例では,コマンドは Filename: というプロンプトをターミナルに表示し,論理名 SYS$COMMAND (省略時の設定ではターミナル) によって指定されるソースから応答を読み込み,応答をシンボル FILE に割り当てます。
$ READ/PROMPT="Filename: " SYS$COMMAND FILE |
次の例では,プロシージャを起動したときに,ファイル名が指定されなかった場合には,ファイル名を要求するプロンプトが表示されます。
$ ! Prompt for a file name if name $ ! is not passed as a parameter $ IF P1 .EQS. "" THEN INQUIRE P1 "Filename" $ COPY 'P1' DISK5:[RESERVED]*.* $ EXIT |
コマンド・プロシージャをキューに登録して,バッチ・ジョブとして実行する場合, DCL は,INQUIRE コマンドに続くデータ行から INQUIRE コマンドに指定されたシンボルの値を読み込みます。データ行を指定しない場合には,シンボルには空値が割り当てられます。 |
コマンド,ユーティリティ,その他のシステム・イメージは,省略時の入力ストリームである論理名 SYS$INPUT に指定されるソースから入力を取得します。コマンド・プロシージャの中では, SYS$INPUT はコマンド・プロシージャ・ファイルとして定義され,データを必要とするコマンドやイメージはこのファイルの中でデータ行を検索します。ただし,SYS$INPUT を再定義すれば,ターミナルや別の入力ファイルからデータを得ることができます。
16.6.1 ターミナルとしての SYS$INPUT の再定義
SYS$INPUT をターミナルとして再定義できます。このようにすると,コマンド・プロシージャから呼び出されたイメージは,コマンド・プロシージャ内のデータ行からではなく,会話形式で入力を入手できます。
コマンド・プロシージャで会話型入力を必要とする DCL コマンドやユーティリティを使用する場合には,SYS$INPUT をターミナルとして再定義しなければなりません。
たとえば,次のコマンド・プロシージャは,入力を会話形式で CENSUS.EXE イメージに提供できるようにします。
$ ! Execute CENSUS getting data from the terminal $ DEFINE/USER_MODE SYS$INPUT SYS$COMMAND $ RUN CENSUS $ EXIT |
DEFINE/USER_MODE コマンドは,CENSUS.EXE を実行しながら, SYS$INPUT を一時的に再定義するため,CENSUS.EXE はターミナルから入力を受け入れます。 CENSUS.EXE が終了すると,SYS$INPUT は元の定義 (コマンド・プロシージャ・ファイル) に戻されます。
たとえば,次のコマンド・プロシージャはEVE エディタを使用します。
$ ! Obtain a list of your files $ DIRECTORY $ ! $ ! Get file name and invoke the EVE editor $ EDIT_LOOP: $ INQUIRE FILE "File to edit (Press Return to end)" $ IF FILE .EQS. "" THEN EXIT $ DEFINE/USER_MODE SYS$INPUT SYS$COMMAND $ EDIT/TPU 'FILE' $ GOTO EDIT_LOOP |
このコマンド・プロシージャは,ユーザが Returnキーを押してループを終了するまで,ファイル名を求めるプロンプトを出します。ファイル名を入力すると,プロシージャは自動的に EVE エディタを起動してファイルを編集します。エディタの実行中,SYS$INPUT はターミナルとして定義されるので,編集内容を会話形式で入力できます。
16.6.2 SYS$INPUT を個別ファイルとして定義する場合
SYS$INPUT をファイルとして定義すれば,コマンド・プロシージャはファイルから入力を得ることができます。コマンド・プロシージャは,データ行のテキストをコマンドまたはイメージに直接渡すことに注意してください。DCL はデータ行は処理しません。データ行に DCL シンボルや式を指定しても,DCL は値をシンボルに置換しませんし,式を評価しません。データ行で感嘆符を使用すると,データを渡す先のイメージが感嘆符(!)を処理します。
データ・ファイルの名前を SYS$INPUT として指定すれば,コマンド・プロシージャ・ファイルにプログラムを登録できます。この操作を実行すると,コンパイラは別のファイルではなく,コマンド・プロシージャからプログラムを読み込みます。
次の例は,FORTRAN コマンドの後にプログラムの文が続くコマンド・プロシージャを示しています。
$ FORTRAN/OBJECT=TESTER/LIST=TESTER SYS$INPUT C THIS IS A TEST PROGRAM A = 1 B = 2 STOP END $ PRINT TESTER.LIS $ EXIT |
FORTRAN コマンドは,論理名 SYS$INPUT を使用してコンパイルするファイルを識別します。 SYS$INPUT はコマンド・プロシージャとして定義されているため, FORTRANコンパイラは,FORTRAN コマンドに続く文を (始めにドル記号が付く次の行まで) コンパイルします。コンパイルが終了すると,2 つの出力ファイル TESTER.OBJ と TESTER.LIS が作成されます。このとき,PRINT コマンドは,リスト・ファイルを印刷します。
前へ | 次へ | 目次 | 索引 |