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


前へ 次へ 目次 索引


14.12.2 シンボル置換の演算子

置換演算子を使用すると, DCL が通常はシンボル置換を行わない場所でのシンボル置換を要求できます。 DCL は,次の 2 つの置換演算子を受け入れます。

この 2 つの演算子の相違点は,置換が行われる時間です。前に一重引用符が付くシンボルは DCL コマンド処理の第 1 フェーズで置換され,前にアンパサンドが付くシンボルは第 2 フェーズで置換されます。コマンド処理のフェーズについての詳細は, 第 14.13 節 を参照してください。

一重引用符 (')

一重引用符 (') は,最もよく使用する置換演算子です。コマンド・パラメータや修飾子の代わりにシンボルを使用する場合に,一重引用符を使用してシンボル置換を要求します。一重引用符は,文字列割り当て (:=) 文の右辺でシンボル置換を要求するのに使用します。

引用符で囲まれた文字列の中でのシンボル置換を要求するには,シンボル名の前に 2 つの一重引用符を置き,シンボル名の後に 1 つの一重引用符を置きます。

一重引用符を使用してシンボル置換を要求した場合は,置換する値の途中では (ハイフン継続文字を使用して) 改行できません。

次の例では,TYPE コマンドは,次にくる文字列がファイル指定を想定するコマンドです。一重引用符は,LIT が評価しなければならないシンボルであることを示しています。一重引用符を省略すると,DCL は LIT.LIS (LIS は,TYPE コマンドの省略時のファイル・タイプ) というファイルを探します。


$ LIT = "LIGHT.BILLS"
$ TYPE 'LIT'

次の例では,NAME の値が置換されて,FILE は REPORT.DAT になります。


$ NAME := REPORT
$ FILE := 'NAME'.DAT
$ SHOW SYMBOL FILE
  FILE = "REPORT.DAT"

次の例では,NAME シンボルの現在の値は FRED です。


$ MESSAGE = "Creating file ''NAME'.DAT"

この場合,MESSAGE は次の値を持ちます。


Creating file FRED.DAT

アンパサンド (&)

アンパサンド (&) もコマンド・インタプリタが認識する置換演算子です。多くの場合,一重引用符とアンパサンドは同じ機能を果たします。アンパサンドは,一重引用符と一緒に使用して置換の実行順序に影響を及ぼすときの置換演算子として最も効果的です。

シンボルが未定義の場合のコマンド・インタプリタのアクションは,コマンドのコンテキストによって決まります。詳細は, 第 14.13.5 項 を参照してください。

最初のコマンドでは,コマンド・インタプリタは,コマンド処理の第 1 フェーズ (検索) で NAME シンボルを現在の値と置き換えます。 2 番目のコマンドは,コマンド処理の第 2 フェーズ (解析) で NAME シンボルを現在の値と置き換えます。方法は異なっても,結果は同じになります。


$ TYPE 'NAME'
$ TYPE &NAME

次の例では,アンパサンドは,一重引用符と一緒に使用されて換の実行順序に影響を及ぼしています。


$ P1 = "FRED.DAT"
$ COUNT = 1
$ TYPE &P'COUNT'

最初に,コマンド・インタプリタは一重引用符で囲まれたシンボル ('COUNT') を評価します。結果は次のようになります。


TYPE &P1

次に,前にアンパサンドが付いたシンボル (P1) を評価します。結果は次のようになります。


TYPE FRED.DAT

次の例のように,P と COUNT の両方と一緒に一重引用符を使用したとします。


$ TYPE 'P''COUNT'

コマンド・インタプリタは,左から右に処理を進めて P を評価しようとします。 P は定義済みのシンボルではないため,DCL は P に空の値を指定します。次に,コマンド・インタプリタは COUNT シンボルを評価します。結果は次のようになります。


TYPE 1

次の例では,A は B の現在の値に等しく定義されています。


$ B = "MYFILE.DAT"
$ A = "&B"
$ TYPE 'A'

アンパサンド (&) を引用符(" ")の中で使用してもシンボル置換は行われません。したがって,割り当てを行っても,B の値は置換されませんが, TYPE コマンドは MYFILE.DAT を表示します。これは,コマンド・インタプリタが最初に &B の値をAに置換するからです。コマンド・インタプリタは,次に MYFILE.DAT を&B シンボルに置換します。 B を再定義すれば,TYPE コマンドの結果はそれに応じて変化します。

アンパサンドを使用するときには,次の規則に従ってください。

14.13 コマンド処理の 3 つのフェーズ

コマンド・インタプリタは,シンボル置換を次の 3 つのフェーズで実行します。

14.13.1 第 1 フェーズ: コマンド入力検索

コマンド入力検索では,前に一重引用符が付いたシンボルを左から右に順に評価します。前に 1 つの一重引用符が付いたシンボルは, 第 1 フェーズ置換 で説明するように,反復変換されますが,前に 2 つの一重引用符が付いたシンボルは反復変換されません。

14.13.2 第 2 フェーズ: コマンドの解析

コマンド解析フェーズでは,次のことを行います。

このフェーズでのシンボル置換は反復されません。

14.13.3 第 3 フェーズ: 式の評価

式の評価フェーズでは,次のことが行なわれます。

このフェーズでのシンボル置換は反復されません。

コマンド・インタプリタは,コマンド・プロシージャの中で実行されるコマンドやプログラムが入力データとして読み込んだ行は解析しないことに注意してください。したがって,このようなデータ行ではシンボル置換を行いません。

AVERAGE プログラムは,SYS$INPUT (コマンド入力ストリーム) から 55, 57,9999 を読み込みます。これらのデータ行はコマンド・インタプリタによっては読み込まれません。シンボル名を入力しても評価されません。


$ RUN AVERAGE 
55 
57 
9999

14.13.4 繰り返し置換と反復置換

シンボル置換には,繰り返し置換と反復置換があります。

第 1 フェーズ置換

一重引用符 (') を使用してシンボル置換を要求すると,コマンド・インタプリタは,コマンド処理の第 1 フェーズで反復置換を実行します。

ただし,引用符で囲まれた文字列の中にシンボルを指定した場合には,一重引用符を使用する置換は反復されません。

次の例では,置換は反復されます。


$ MAC = "5"
$ A = "'MAC'"
$ B = 'A'
$ SHOW SYMBOL B
  B = 5  Hex = 00000005  Octal = 00000000005

次の理由から,B = 'A' 文の後, B シンボルの値は 5 になります。

ただし,A を引用符で囲まれた文字列の中で指定した場合にはどうなるでしょう。


$ B = "''A'"
$ SHOW SYMBOL B
  B = "'MAC'"

この場合は,B は 'MAC' の値を持ちます。引用符で囲まれた文字列の中では置換は反復されないため,シンボル名 A は一回だけ置換されます。

第 2 フェーズ置換

コマンド・インタプリタが反復置換を自動的に実行するのは,コマンド行に一重引用符がある場合だけです。場合によっては,コマンド同意語の定義をネストするとよいでしょう。

次の例では,EXEC が処理されると,コマンド・インタプリタは置換を一回だけ実行します。


$ MAC = "TYPE A.B"
$ EXEC = "'MAC'"
$ EXEC

結果は文字列 'MAC' になります。 MAC はコマンドとして認識されないため,エラー・メッセージが出されます。このエラーは,コマンド処理の第 1 フェーズに置換が実行されない (EXEC 文字列が一重引用符によって区切られていない) ために生じています。第 2 フェーズでは,EXEC がコマンド行の最初の値であるため,文字列 'MAC' が EXEC に置き換えられます。この置換は反復されません。したがって,'MAC' が一重引用符で区切られていても,これ以上置換は行われません。

コマンド同意語 EXEC を正しく使用するには,次に示すように, EXEC を一重引用符で囲みます。


$ 'EXEC'

この場合,コマンド処理の第 1 フェーズで EXEC シンボルが評価されます。この置換は反復置換であるため,('MAC') も評価され, TYPE A.B 文字列が置換されます。

第 3 フェーズ置換

コマンド・インタプリタがコマンドの中の式を解析すると,式の中に指定されたシンボルは一回だけ置換されます。ただし,式の中に一重引用符またはアンパサンドを使用すれば,反復置換を強制できます。このようにして反復置換を強制した場合には,次の点に注意してください。

置換の結果,有効なシンボル名が得られない場合には,コマンドは正しく実行されないことに注意してください。

次の例は,IF コマンドでの反復置換を示しています。


$ P1 = "FRED.DAT"
$ COUNT = 1
$ IF P'COUNT' .EQS. "" THEN GOTO END

コマンド・インタプリタはこの行を検索して, COUNT シンボルをその現在の値と置き換えます。結果は次のようになります。


IF P1 .EQS. "" THEN GOTO END

この文字列には一重引用符がないため,コマンド・インタプリタはこれ以上置換を実行しません。ただし,IF コマンドを実行すると,シンボル名 P1 を自動的に評価して,その現在の値と置き換えます。

次の例では,シンボル名 FILENAME は無効です。


$ FILENAME = "A.B"
$ IF 'FILENAME' .NES. "" THEN TYPE 'FILENAME'

コマンド・インタプリタは,FILENAME シンボルをその現在の値 (A.B) に置き換えます。結果は次のようになります。


IF A.B .NES.  "" THEN TYPE A.B

IF コマンドがコマンド行を実行するとき,A.B は有効なシンボルでないため,エラーになります。この IF コマンドを正しく処理するためには,次のように,一重引用符を省略します。


$ IF FILENAME .NES. "" THEN TYPE 'FILENAME'

14.13.5 未定義シンボル

コマンド行でシンボルを使用するときにそのシンボルが未定義の場合には,コマンド・インタプリタは,コンテキストに応じて,エラー・メッセージを表示するか,シンボルを空の文字列と置き換えます。未定義シンボルについては,次の規則が適用されます。

次の例は,コマンド・インタプリタが前に一重引用符が付いた未定義シンボルをどのように処理するかを示しています。


$ FILE := MYFILE'FILE_TYPE'
$ SHOW SYMBOL FILE
  FILE = "MYFILE"
$ PRINT 'FILE'

FILE シンボルが作成されると, FILE_TYPE シンボルがその現在の値と置き換えられます。 FILE_TYPE が定義されていない場合は,FILE_TYPE は空の文字列と置き換えられます。ファイル指定の中にファイル・タイプがないと, PRINT コマンドは省略時のファイル・タイプである LIS を使用します。したがって,ファイル指定は MYFILE.LIS と解釈されます。

次の例では,コマンド処理の第 3 フェーズで式が評価されます。


$ A = 1
$ C = A + B
%DCL-W-UNDSYM, undefined symbol - check validity and spelling

B シンボルは未定義であるため,コマンド・インタプリタは式を評価できません。

14.14 シンボルを使用するための別の方法: 自動的なフォーリン・コマンド

プロシージャに対してシンボルを定義せずに, DCL レベルからコマンド・プロシージャ (ファイル・タイプ .COM) または実行可能イメージ (ファイル・タイプ .EXE) を起動することもできます。自動的なフォーリン・コマンドを使用すると, DCL は特定のディレクトリからコマンド・プロシージャまたは実行可能イメージを検索して,それを自動的に実行できます。

DCL シンボルでなく, DCL コマンド・テーブルに登録されていないコマンド動詞を入力すると,一般に次のメッセージが表示されます。


DCL-W-IVVERB, unrecognized command verb - check validity and spelling 

しかし,論理名 DCL$PATH が定義されている場合には (およびブランクでない場合には),DCL はファイル名に無効動詞が含まれており,省略時のファイル指定として DCL$PATH:.* が指定されているファイルに対して, RMS $SEARCH を実行します。

DCL が .COM または .EXE ファイルを検索すると,コマンド行の残りの部分をパラメータとして使用して,そのファイルを自動的に実行します (この動作は,DOS,UNIX,その他のオペレーティング・システムの PATH オプションによく似ています)。

次の例では,DCL シンボル SYSGEN は必要ありません。 DCL はSYS$SYSTEM ディレクトリから SYSGEN.EXE を検索します。 DCL は,シンボル "SYSGEN" が "$SYS$SYSTEM:SYSGEN" として定義されているかのように動作し,SYSGEN イメージをフォーリン・コマンドとして起動します。


$ SYSGEN
%DCL-W-IVVERB, unrecognized command verb - check validity and spelling 
 \SYSGEN\
$ DEFINE DCL$PATH SYS$SYSTEM,SYS$DISK:[]FOO
$ SYSGEN SHOW MAXPROCESSCNT
Parameter Name   Current   Default    Min.    Max.    Unit  Dynamic 
--------------   -------   -------   ------- -------  ----  ------- 
MAXPROCESSCNT        157        32        12    8192 Processes 

次の例では,SS は "@SS.COM" として定義しておく必要がありません。これは,DCL が SYS$SYSTEM ディレクトリから SS.COM または SS.EXE を自動的に検索するからです。その処理を正しく実行できない場合には, DCL はカレント・ディレクトリから SS.COM または SS.EXE を検索します。


$ TYPE SS.COM
$ SHOW SYMBOL/LOCAL/ALL
$ EXIT
$ SS "This is a parameter"
  P1 = "This is a parameter" 
  P2 = "" 
  P3 = "" 
  P4 = "" 
  P5 = "" 
  P6 = "" 
  P7 = "" 
  P8 = "" 
$ SS.EXE "This is a parameter"
  P1 = ".EXE" 
  P2 = "This is a parameter" 
  P3 = "" 
  P4 = "" 
  P5 = "" 
  P6 = "" 
  P7 = "" 
  P8 = ""

この例では,DCL は SS.COM を検索し,"SS" が "@SS.COM" として定義されているシンボルであるかのように動作します。コマンド行の残りの部分をパラメータとして解析して,コマンド・プロシージャが起動されます。 "SS.EXE" がイメージ SS.EXE を起動するのではなく, 2 つのパラメータを使用して SS.COM が起動され,最初のパラメータが ".EXE" というテキスト文字列であることに注意してください。これは,OpenVMS オペレーティング・システムで,コマンドの解析とシンボルの置換が実行される方法と一貫しています。


前へ 次へ 目次 索引