コマンド・プロシージャを作成する

コマンド・プロシージャはエディタを使用して作成します。コマンド・プロシージャの作成規則は次のとおりです。

コマンド・プロシージャを実行する -- @

作成したコマンド・プロシージャを実行するには次のように入力します。


    $ @コマンド・プロシージャ・ファイル指定 [パラメータ1] [パラメータ2] …    

コマンド・プロシージャ・ファイルがデフォルト・ディレクトリにない場合は,ディレクトリ指定も必要です。

コマンド・プロシージャは,コマンド・プロシージャ・ファイルのコマンドを先頭から順番に実行します。また,1 つのコマンドの実行が完全に終わってから次のコマンドに進みます。

実行コマンドを表示する -- SET VERIFY

デフォルトでは,コマンド・プロシージャ実行中に,コマンドそのものは画面に表示されません。実行コマンドを表示するには,次のようにします。


    $ SET VERIFY    

実行コマンドの表示をしない場合は,次のようにします。


    $ SET NOVERIFY    

これらのコマンドは,ターミナルからコマンドとして入力できますが,コマンド・プロシージャの中に含めることもできます。

コマンド・プロシージャの実行例




ABC.FOR というプログラムをコンパイル,リンク,実行するコマンド・プロシージャ (TEST.COM) の例を次に示します。

TEST.COM


    ----------------------------------------------    
        $ FORTRAN ABC 
        $ LINK ABC 
        $ RUN ABC 
    ---------------------------------------------- 

コマンド実行の状態を確認できるように,SET VERIFY を実行します。


    $ SET VERIFY   

TEST.COM 実行します。


    $ @TEST   

各コマンドを表示しながら自動的に実行します。


    $ FORTRAN ABC   
    $ LINK ABC 
    $ RUN ABC 

パラメータの使用

ファイル指定が異なるためにプログラムごとに別々のコマンド・プロシージャを作るのは不便です。そこで,コマンド・プロシージャにパラメータを使用して,実行時にファイル名を与えることができます。

パラメータの使用には次の規則があります。

パラメータの使用例




ソース・プログラム名をパラメータとして,コンパイル,リンク,実行をするコマンド・プロシージャ (TEST1.COM) の例を次に示します。

TEST1.COM


    ----------------------------------------------    
        $ FORTRAN 'P1' 
        $ LINK 'P1' 
        $ RUN 'P1' 
    ---------------------------------------------- 

コマンド実行の状態を確認できるように SET VERIFY を実行します。


    $ SET VERIFY    

パラメータとして ABC を指定して TEST1.COM を実行します。


    $ @TEST ABC    

各コマンドを表示しながら自動的に実行します。


    $ FORTRAN ABC    
    $ LINK ABC 
    $ RUN ABC 

ログイン・プロシージャを使用する

ログインすると自動的に実行されるプロシージャを,ログイン・プロシージャといいます。

キーの定義やコマンド列の置き換えは,ログアウトすると無効になってしまいます。同じ定義や置き換えを使いたい場合は,ログイン時に再定義しなければなりません。キーの定義やコマンド列の置き換えをログイン・プロシージャに入れておけば,自動的に定義されるので,ログインするたびに定義し直す手間が省けます。

ログイン・コマンド・プロシージャには,通常は次のようなコマンドを盛り込みます。

コマンド 参照箇所
論理名の定義 (ASSIGN,DEFINE コマンド) 論理名を使用する
グローバル・シンボルの定義 (==) シンボルを使用する
キーの定義 (DEFINE/KEY コマンド) キーボードを使用する
デフォルト・ディレクトリの設定や表示
(SET DEFAULT コマンド,SHOW DEFAULT コマンド)
ファイルを指定する
環境設定 (JSY$CONTROL ユーティリティ) DCL コマンドを使用する

ログイン・プロシージャを作成する

ログイン・プロシージャのファイル名とファイル・タイプは,通常は,LOGIN.COM です。このファイルは,ログイン・ディレクトリに置かなければなりません。エディタを使用して作成します。

ログイン・プロシージャを作成する際は,次の規則に従ってください。

ログイン・プロシージャの例




ログイン・プロシージャの例 (LOGIN.COM) を示します。

LOGIN.COM の内容を表示します。


    $ TYPE LOGIN.COM    

LOGIN.COM


    ----------------------------------------------    
        $! LOGIN.COM (YAMADA) 
        $ DEFINE/KEY PF1 "SHOW DEFAULT" 
        $ DEFINE/KEY PF2 "SET DEFAULT" 
        $ PR == "PRINT/QUEUE=PRINTER1" 
        $ EXIT 
    ---------------------------------------------- 

この例では,キーを定義 (SHOW DEFAULT, SET DEFAULT) しています。また,シンボルも定義 (PR == "PRINT/QUEUE=PRINTER1") しています。そして,処理の実行を終了するために EXIT としています。 ( 感嘆符 (!) に続く文字列は注釈 ( コメント ) です。)

プロンプト・メッセージを出力するコマンド・プロシージャ -- INQUIRE

画面にプロンプト・メッセージを出力し,ユーザが入力した文字列をシンボルに割り当てるには次のようにします。 (小文字は大文字に変換されます。)


    $ INQUIRE[/GLOBAL] シンボル  "プロンプト・メッセージ"    

次の例 HELP.COM では,HELP で画面に出される内容をファイルに出力します。その際,作ったファイルをプリンタへ出力するか尋ね,ユーザが Y と入力した場合はプリンタ出力します。 (感嘆符 (!) に続く文字列は注釈 (コメント) です。)




HELP.COM


    -----------------------------------------------------    
        $ 
        $! HELP FILE を出力するコマンド・プロシージャ 
        $ 
        $ HELP/NOPAGE/NOPROMPT/OUTPUT='P1'.HLP 'P1' 
        $ INQUIRE ANS " PRINT OUT? [N] " 
        $ IF ANS THEN PRINT 'P1'.HLP 
        $ EXIT 
    ----------------------------------------------------- 

シンボルと文字列をコマンド・プロシージャに組み込む

DCL コマンド列以外の文字列をシンボルに定義してシンボルを使用することができます。たとえば,シンボルにディレクトリ名を定義し,コマンド列の一部としてそのシンボルを用いることができます。

ただし,シンボルを DCL コマンド行の先頭以外で使う場合には,次のように引用符 (') で囲むことが必要です。


    $ DIR_NAME = "[YAMADA.WORK]"    
    $ SET DEF 'DIR_NAME' 

次の例では,実行時にパラメータが指定されなかった時は,P1 を入力するように促します。( コマンド行の先頭以外でシンボルを使う場合には,引用符 (') で囲みます。)




DEFAULT.COM


    ---------------------------------------------------------    
        $ IF P1 .EQS. "" THEN INQUIRE P1 "INPUT P1" 
        $ SET DEFAULT [YAMADA.'P1'] 
        $ SHOW DEFAULT 
        $ EXIT 
    --------------------------------------------------------- 

SET VERIFY を実行します。


    $ SET VERIFY    

DEFAULT.COM を実行し,P1 として WORK を指定します。


    $ @DEFAULT WORK 
    $ IF P1 .EQS. "" THEN INQUIRE P1 "INPUT P1"    

P1 が WORK に置き変わって実行されます。


    $ SET DEFAULT [YAMADA.WORK]    
    $ SHOW DEFAULT 
      DKA0:[YAMADA.WORK] 
    $ EXIT 

シンボルとコマンド・プロシージャを組み合わせる

シンボルとコマンド・プロシージャを組み合わせることもできます。

次の例では,表示を整えるために空白行をターミナルに出力し,It was fun working with you. Have a nice day !というメッセージをターミナルに出力します。次に表示を整えるために空白行をターミナルに出力し,ログアウトします。




LOGOUT.COM


    ---------------------------------------------------------------------------    
        $ WRITE SYS$OUTPUT "" 
        $ WRITE SYS$OUTPUT "It was fun working with you. Have a nice day !" 
        $ WRITE SYS$OUTPUT "" 
        $ LOGOUT 
    --------------------------------------------------------------------------- 

BYE というシンボル名に,コマンド・プロシージャを起動するコマンド文字列を定義します。


    $ BYE == "@SYS$LOGIN:LOGOUT.COM"    

シンボル BYE を実行します。コマンド・プロシージャ LOGOUT.COM が起動し,ターミナルに空白行が出力されます。


    $ BYE    
  

ターミナルにメッセージが出力され,次に空白行が出力されます。


    It was fun working with you.  Have a nice day  !    
  

コマンド・プロシージャ LOGOUT.COM の最終行が実行され,ログアウトします。


      YAMADA   logged out at 14-FEB-2002 18:30:45.10    

ログイン・コマンド・プロシージャを起動させずにログインする

ログイン・コマンド・プロシージャを起動しないでログインするには,ユーザ名を入力するときに /NOCOMMAND という修飾子をつけます。





                                                                   
 
            Welcome to OpenVMS/Alpha V7.3-1 
 
    Username: YAMADA/NOCOMMAND 
    Password: 
          Welcome to OpenVMS/Alpha version V7.3-1 on node ABC 
       Last interactive login on Tuseday, 12-FEB-2002 10:26 
 
    $ 
                                                                 

また,次のようにして,別のコマンド・プロシージャ・ファイルをログイン・コマンド・プロシージャとして指定することもできます。


    /COMMAND = ファイル指定    

条件式を使用する





IF コマンドを使うことで,条件によって処理を変えることができます。次のコマンド・プロシージャは,入力した数値が負数の場合に警告を表示します。


    $ INQUIRE VALUE 
    $ IF VALUE .LT. 0 THEN WRITE SYS$OUTPUT "負数です。"    

IF コマンドの形式は次の通りです。


    $ IF 条件式 THEN コマンド    

条件式が成り立つ場合 ( 真の場合 ) に THEN の後のコマンドが実行されます。THEN の後に書くことのできるコマンドは 1 行につき 1 つだけです。

複数のコマンドを書く場合には次のように書きます。条件式が成り立つ場合は,THEN と ENDIF で挾まれたコマンドが実行されます。


    $ IF 条件式 
    $ THEN 
    $   コマンド1    
    $   コマンド2 
    $       : 
    $   コマンドn 
    $ ENDIF 

条件式が成り立たない時にコマンドを実行させたい場合には, ELSE を使います。条件式が成り立たなかったとき,ELSE と ENDIF ではさまれたコマンドが実行されます。


    $ IF 条件式 
    $ ELSE 
    $   コマンド1    
    $   コマンド2 
    $       : 
    $   コマンドn 
    $ ENDIF 

THEN と ELSE の両方を使うこともできます。条件式が成り立つ場合には,THEN と ELSE に挾まれたコマンドが実行されます。条件式が成り立たなかった場合には ELSE と ENDIF に挾まれたコマンドが実行されます。


    $ IF 条件式 
    $ THEN 
    $   コマンド1a    
    $   コマンド2a 
    $       : 
    $   コマンドna 
    $ ELSE 
    $   コマンド1b 
    $   コマンド2b 
    $       : 
    $   コマンドnb 
    $ ENDIF 

コマンドが 1 つしかない場合は,次のように短縮して書くこともできます。


    $ IF 条件式 
    $ THEN コマンドa    
    $ ELSE コマンドb 
    $ ENDIF 

条件式の書き方

条件式の代表的な書き方は,2 つの数値や文字列の比較によるものです。 2 つの数値や文字列 (またはそれらを含んだシンボル) を比較演算子で結びます。

たとえば,I .LT. 0 は,「シンボル I が 0 より小さいとき」という意味です。 .LT. はその左辺と右辺を数値として比較します。左辺が右辺より小さければ真,そうでなければ偽の値を持ちます。 DCL の数値比較演算子には次のようなものがあります。

数値比較演算子
演算子 意味
.EQ. 等しい
.GE. 左辺が右辺より大きいまたは等しい
.GT. 左辺が右辺より大きい
.LE. 左辺が右辺より小さいまたは等しい
.LT. 左辺が右辺より小さい
.NE. 等しくない

文字列の比較は文字列用の比較演算子を使用します。文字列の大小の比較は ASCII コードで比較されます。

文字列比較演算子
演算子 意味
.EQS. 等しい
.GES. 左辺が右辺より大きいまたは等しい
.GTS. 左辺が右辺より大きい
.LES. 左辺が右辺より小さいまたは等しい
.LTS. 左辺が右辺より小さい
.NES. 等しくない

条件式を .AND. または .OR. でつなぐと複数の条件式を組み合わせることもできます。次のようにします。


    $ IF 条件式1 .AND. 条件式2 THEN コマンド    

IF-THEN-ELSE-ENDIF の形式でも同じように書くことができます。たとえば,次のコマンド・プロシージャでは,1 〜 9 以外の数字を入力した時に警告を出します。





    $ INQUIRE VALUE 
    $ IF VALUE .GE. 1 .OR. VALUE .LE. 9 
    $ THEN 
    $   WRITE SYS$OUTPUT "正しい数値です" 
    $ ELSE 
    $   WRITE SYS$OUTPUT "範囲外の数値です"    
    $ ENDIF 

条件式が複雑でわかりにくい時は,次のように括弧 ( ) で括って整理しましょう。


    $ IF (VALUE .GE. 1) .OR. (VALUE .LE. 9)    

ラベルが付いた行へジャンプする

GOTO コマンドを使って特定のラベルが付いた所へジャンプさせることができます。たとえば次のコマンド・プロシージャは,ラベル LEAP_YEAR にジャンプさせるものです。





    $ GOTO LEAP_YEAR    
        : 
        : 
    $ LEAP_YEAR: 
    $ WRITE SYS$OUTPUT "ここがLEAP_YEARです。"    

ラベルは,行頭の $ の後に書き,最後にコロンを付けます。ラベルには空白文字は使えません。

次のように,ラベルのすぐあとにコマンドを書くこともできます。


    $ LEAP_YEAR: WRITE SYS$OUTPUT "ここがLEAP_YEARです。"    

ループを作る

IF コマンドと GOTO コマンドを組み合わせることでループを作ることができます。たとえば,次のコマンド・プロシージャは 10 回回るループです。





    $ I = 1 
    $ LOOP: IF I .GE. 11 THEN GOTO EXIT_LOOP    
    $   WRITE SYS$OUTPUT "ループ''I'回目" 
    $   I = I + 1 
    $ GOTO LOOP 
    $ EXIT_LOOP: 

エラー処理を組み入れる

コマンドの実行中にエラーが起こるとコマンド・プロシージャはその実行を中断します。エラー処理を組み入れることで実行を継続したり後処理をするなどの制御ができるようになります。 (エラー・メッセージの種類,形式については,ヘルプとシステム・メッセージ をご覧ください。)

エラー処理を規定する

エラーが起こった場合の処理を ON コマンドであらかじめ規定しておくことができます。


    $ ON WARNING THEN コマンド 
    $ ON ERROR THEN コマンド 
    $ ON SEVERE_ERROR THEN コマンド    

ON WARNING は警告 (-W-) が起きた場合の処理を規定します。 ON ERROR はエラー (-E-) が起きた場合の処理を規定します。 ON SEVERE_ERROR は致命的なエラー (-F-) が起きた場合の処理を規定します。

エラー処理を組み込れたコマンド・プロシージャの例

たとえば,エラーが起きた時にメッセージを表示して終了するには,次のようなコマンド・プロシージャを書きます。





    $ ON ERROR THEN GOTO ERRPROC 
          : 
    $ ERRPROC: 
    $ WRITE SYS$OUTPUT "エラーが発生しました。中断します。"    
    $ EXIT 

上記の例では,エラーが起きた時にラベル ERRPROC へジャンプします。

[Ctrl] + [Y] による強制終了時の処理

コマンド・プロシージャの実行中にキーボードから [Ctrl] + [Y] (コントロール Y) を入力すると実行を中断してコマンド待ちの状態に戻りますが, [Ctrl] + [Y] が入力されたときの処理を ON コマンドであらかじめ規定しておくことができます。


    $ ON CONTROL_Y THEN コマンド    

次の例では,コマンド・プロシージャの実行中に [Ctrl] + [Y] が入力された場合,ファイルが開いていれば,それを閉じてから終了します。





    $ ON CONTROL_Y ERROR THEN GOTO INTERRUPT    
    $ OPEN/READ DATAFILE FOO.DAT 
          : 
    $ INTERRUPT: 
    $ IF F$TRNLNM("DATAFILE",,,,,"MAX_INDEX") .NES. "" THEN CLOSE DATAFILE 
    $ WRITE SYS$OUTPUT "強制中断されました。" 
    $ EXIT 

また,この ON コマンドによる [Ctrl] + [Y] の制御は, [Ctrl] + [C] が入力された場合でも同じように働きます。