# OpenVMS
ユーザーズ・マニュアル

前へ | 次へ | 目次 | 索引

# 第 16 章
DCL での拡張プログラミング

拡張 DCL プログラミングとは，複雑なコマノド・プロシージャと DCL コマンドの PIPE コマンドを使用することです。

複雑なコマンド・プロシージャは，プログラムと同様の機能を実行できます。コマンド・プロシージャでは，変数入力を使用でき，特定の条件が真のときにだけプロシージャのセクションを実行でき，サブルーチンを実行したり，他のコマンド・プロシージャを起動することができます。

DCL の PIPE コマンドも，プログラムと同様の機能を実行できます。たとえば PIPE コマンドを使用すると，同一 DCL コマンド行から，次に示す 1 つまたは複数の操作を実行できます。

- パイプライン処理(コマンドのシーケンス)

- 入出力のリダイレクト

- 複数の条件コマンドの実行

- バックグラウンド処理

本章では，次のことについて説明します。

- コマンド・プロシージャ入力の実行

- ネスティングしたコマンド・プロシージャにデータを渡すためのパラメータの使用

- コマンド・プロシージャ出力の実行

- ファイルの読み込みと書き込み (ファイル入出力)

- ファイル入出力エラーの処理

- 実行の流れを制御する方法

- 新しいコマンド・レベルの作成

- CASE文の書き方

- PIPE コマンドの使用

本章は次の方を対象にしています。

- 第 15 章 の内容を読み，理解している方

- DCL でのプログラミングについて基本的な知識があり，高度なプログラミング方式を学習したい方

その他の情報については，次のものを参照してください。

- この章で説明しているすべてのコマンドの詳細情報については，『Compaq OpenVMS DCL ディクショナリ』

- Extended File Specifications のある環境の DCL でのプログラミングについては，『OpenVMS Extended File Specifications の手引き』

# 16.1 コマンド・プロシージャ入力の実行

コマンド・プロシージャでは，ユーザが提供するデータを必要とすることがよくあります。このデータ，つまり入力は会話形式で入手でき( 第 15 章 を参照)，非会話形式で入手することもできます。本章では，非会話型入力方式について説明し， 第 15 章 で説明していない会話型入力方式についても説明します。

コマンド・プロシージャを実行するたびに，同じデータを使用できます。同じデータを使用するには，コマンド・プロシージャでデータを必要とするコマンドの後のデータ行にデータを指定します。

次のコマンド・プロシージャは， CENSUS.EXE コマンド・プロシージャを実行します。 CENSUS.EXE はプロシージャが実行されるたびに 1993，1994，1995 のデータを読み込みます。

    $ ! CENSUS.COM
    $ !
    $ RUN CENSUS
    1993
    1994
    1995
    $ EXIT

## 16.1.1 コマンド・プロシージャにデータを登録する場合の制限事項

DCL は，データ行に指定されたテキストをコマンド・プロシージャに直接渡します。したがって，次に示すように，変換しなければならないデータは処理されません。

- シンボル

- 論理名

- 数式

## 16.1.2 その他のデータ入力方式

この後の節では，次に示すように，コマンド・プロシージャに対する入力データを入手するための別の方法について説明します。

- データを渡すためのパラメータの使用

- バッチ・ジョブにデータを渡すためのパラメータの使用

- ネスティングしたコマンド・プロシージャにデータを渡すためのパラメータの使用

- データを要求するプロンプトを表示するための READ，INQUIRE コマンドの使用

- データを入手するための SYS$INPUT 論理名の使用

# 16.2 データを渡すためのパラメータの使用

コマンド・プロシージャにデータとしてパラメータを渡す場合には，次のガイドラインに従ってください。

- パラメータはコマンド・プロシージャのファイル指定の後に指定する。

- 1 つのコマンド・プロシージャに対して最大8つのパラメータを渡すことができる。

- 渡すパラメータ値の数が 8 未満の場合には，値が渡されなかったシンボルにはヌル値が割り当てられる。ヌル値とは空文字列であり，引用符 (" ") で表現される。

- パラメータは 1 つ以上のスペースまたはタブで区切る。

DCL はローカル・シンボル P1〜P8 を使用して，パラメータをコマンド・プロシージャに渡します。 P1 には最初のパラメータ値が割り当てられ，P2 には 2 番目のパラメータ値， P3 には 3 番目のパラメータ値が割り当てられます。以下も同様です。たとえば，次のコマンドは，コマンド・プロシージャ SUM.COM を起動し， 8 つのパラメータをプロシージャに渡します。

    $ @SUM 34 52 664 89 2 72 87 3

## 16.2.1 整数としてのパラメータの指定

パラメータとして整数を指定した場合には，それは文字列に変換されます。次の例では，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

## 16.2.3 シンボルとしてのパラメータの指定

シンボル値を渡すには，シンボルの前後を一重引用符で囲みます。シンボル値の内部でスペース，タブ，小文字を保存するには，値を 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'"

## 16.2.4 ヌル値としてのパラメータの指定

空のパラメータを渡すには，コマンド文字列の位置を表す一組の二重引用符を使用します。次の例では，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 コマンドに指定されたシンボルの値を読み込みます。データ行を指定しない場合には，シンボルには空値が割り当てられます。

# 16.6 データを入手するための SYS$INPUT 論理名の使用

コマンド，ユーティリティ，その他のシステム・イメージは，省略時の入力ストリームである論理名 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 コマンドは，リスト・ファイルを印刷します。

前へ | 次へ | 目次 | 索引