Hitachi

JP1 Version 11 JP1/Advanced Shell 


5.1.6 メタキャラクタ

メタキャラクタとは,ジョブ定義スクリプト内で特別な意味を持つキャラクタのことです。次に示す文字をジョブ定義スクリプトに記述すると,ジョブコントローラはメタキャラクタと解釈します。

| & ; < > ( ) $ ` ' \ " ~ # * [ ] ?

メタキャラクタを一般的な文字として使用したい場合,メタキャラクタの無効化を行う必要があります。メタキャラクタの無効化の方法を次の表に示します。

表5‒6 メタキャラクタの無効化の方法

無効化の方法

意味

'str'

文字列str'以外のすべての文字をそのままの文字として処理します。

"str"

文字列str$\`以外の文字をそのままの文字として処理します。

ただし,\の直後の文字が$\`"の場合,\はメタキャラクタとして有効となります。文字列strにそのままの文字として\を含める場合は,\\と記述してください。

\char

文字charの特殊な意味を無効(エスケープ文字)にします。

ただし,メタキャラクタを無効化した内容を出力する場合は,echoコマンドおよびprintコマンドなど,出力する組み込みコマンドの仕様に従って処理されます。

ジョブ定義スクリプトの内容
echo 'JP1/AS\n'        # 1.
echo "JP1/AS\n"        # 2.
echo JP1/AS\\n         # 3.
echo 'JP1/AS\\n'       # 4.
echo "JP1/AS\\n"       # 5.
実行ジョブのSTDOUTファイルの内容
********   実行ジョブのSTDOUTファイルの内容    ********
JP1/AS        ←1.の結果 echoコマンドが\nを改行として出力
 
JP1/AS        ←2.の結果
 
JP1/AS        ←3.の結果
 
JP1/AS\n      ←4.の結
JP1/AS        ←5.の結
 

4.の場合は,''(シングルクォーテーション)で囲まれているため,\\nechoコマンドに渡ります。そのため,echoコマンドは\\を文字\と解釈し,文字\と文字nを出力します。

5.の場合は,""(ダブルクォーテーション)で囲まれているため,\\を文字\と解釈し,\nechoコマンドに渡ります。そのため,echoコマンドは\nを改行文字として出力します。

メタキャラクタを使用した機能について説明します。

〈この項の構成〉

(1) 位置パラメーター

ジョブ定義スクリプトを実行する場合,ジョブ定義スクリプトファイル名の後ろに実行時パラメーターを指定すると,ジョブ定義スクリプトに引数として渡すことができます。JP1/Advanced Shellはこの引数を「位置パラメーター」と呼ぶ特殊な変数に代入します。位置パラメーターは「$0」から「$9」の10個が用意されており,「$0」には実行したジョブ定義スクリプトファイル名が代入されます。$1から$9には指定した順に引数が代入されます。JP1/Advanced Shellの位置パラメーターおよび関連する特殊文字について次の表に示します。

表5‒7 JP1/Advanced Shellの位置パラメーターおよび関連する特殊文字

位置パラメーターおよび特殊文字

意味

位置パラメーター

$0

ジョブ定義スクリプトのファイル名です。

$n

ジョブ定義スクリプトに指定した第n引数の値(nは1〜9まで)です。

関連する特殊文字

$#

ジョブ定義スクリプトに指定した引数の数です。

$*

ジョブ定義スクリプトに指定した引数すべてです。

$@

ジョブ定義スクリプトに指定した引数すべてです。

"$*"

ジョブ定義スクリプトに指定した引数すべてを一まとめにして扱います。

 例:"$1 $2 $3 ... "

IFSシェル変数を変更していた場合,IFSシェル変数の値で区切られます。

"$@"

ジョブ定義スクリプトに指定した引数すべてを個別に扱います。

 例:"$1" "$2" ... "

IFSシェル変数を変更していた場合,スペースで区切られます。

ジョブ定義スクリプト内で位置パラメーターを変更するには,シェル標準コマンドのsetコマンドを使用します。setコマンドについては,「9.3 シェル標準コマンド」の「setコマンド(シェルオプションを設定する,配列を作成する,または変数の値を表示する)」を参照してください。

(2) 文字列区切り

JP1/Advanced Shellは,IFSシェル変数に指定された文字を「文字列を区切る文字」として扱います。IFSシェル変数の初期値はスペース,タブ文字または改行文字であるため,スペースおよびタブ文字が文字列の区切りとして扱われます。複数のスペース,タブ文字が連続しても,1つの区切り文字として扱われます。IFSシェル変数の詳細については,「5.5 シェル変数」を参照してください。

また,スペースやタブ文字を文字列として使用する場合は,スペース,タブ文字を含む文字列をクォーテーション(’および”)で囲む必要があります。

(3) 行継続

複数行にわたってコマンドを記述する場合の記述手順を次に示します。

  1. 行の終端に\を付けて改行します。

  2. 行の終端をクォーテーションで囲まないで改行し,複数行の最初と最後だけクォーテーションで囲みます。

このように記述すると行が継続していると判断し,同一行として処理されます。

(4) コメント

ジョブ定義スクリプト内にコメントを記述できます。行中に「#」を記述すると,「#」以降から行末までをコメントとして扱い,処理を行います。ただし,「#」の後ろに「-adsh」が記述されている場合は,次のように処理をします。

なお,スクリプト拡張コマンドの行にはコメントを記述できません。

(5) ワイルドカード

条件に合致するファイル名やディレクトリ名の特定,任意の文字列との比較などに,ワイルドカードが使用できます。

JP1/Advanced Shellで使用できるワイルドカードを次の表に示します。

表5‒8 JP1/Advanced Shellで使用できるワイルドカード

ワイルドカード

意味

?

任意の1文字に合致します。ただし,ドットファイルのドット「.」は除きます。

*

0文字以上の文字列に合致します。ただし,ドットファイルのドット「.」は除きます。

[…]

[ ]に囲まれた文字列のどれか1文字に合致します。[ ]に囲まれた文字列の先頭に!を付加した場合,[ ]に囲まれていない文字に合致します。]を文字として指定する場合は,文字列の先頭に指定してください。

ハイフン(-)で区切ると,ハイフンで区切られたその間にある任意の文字(その2文字も含む)に合致します。ハイフンを文字として指定する場合は,文字列の先頭または末尾に指定してください。記述例を次の表に示します。

{str,...}

ブレース展開によって,コンマで区切られた文字列strを展開します。ただし,次の場合は展開しません。

  • braceexpandシェルオプションが無効の場合

  • noglobシェルオプションが有効の場合

ワイルドカード[ ]の記述例を次の表に示します。

表5‒9 ワイルドカード[ ]の記述例

記述例

意味

[]a]

文字列]aと合致します。

[!abc]

文字列abc以外と合致します。

[0-9]

0から9までのどれかに合致します。

[a-z]

英小文字に合致します。

[A-Z]

英大文字に合致します。

[0-9a-zA-Z]

英数字に含まれます。

[-abc]

文字列-abcと合致します。

[!-abc]

文字列-abc以外と合致します。

(6) 置換

置換機能として次の3つの機能があります。

(a) 変数置換

変数置換には,変数の状態によって実行される変数置換,変数の値の文字列長や配列の要素数への変数置換,パターンマッチングの結果によって実行される変数置換,部分文字列展開があります。

  • 変数の状態によって実行される変数置換

    変数の状態によって実行される変数置換の書式を次の表に示します。variableには変数名,wordにはvariableの状態によって展開される変数を指定します。また,使用例および結果のaは未定義の変数,b=NULL,c=1とします。

    表5‒10 変数の状態によって実行される変数置換の書式

    書式

    説明

    使用例

    結果

    ${variable:-word}

    variableを変数として定義しかつ値を代入している場合,variableの値を返します。

    variableは定義されていてNULLまたは未定義の場合,wordの展開結果を返します。variableの値は変更しません。

    cnt=${a:-7}

    cntに7を代入

    cnt=${b:-8}

    cntに8を代入

    cnt=${c:-9}

    cntにcの値を代入

    ${variable-word}

    variableを変数として定義しかつ値を代入している場合,variableの値を返します。

    variableは定義されていてNULLの場合,variableの値(NULL)を返します。variableが未定義のときは,wordの展開結果を返します。variableの値は変更しません。

    cnt=${a-7}

    cntに7を代入

    cnt=${b-8}

    cntにNULLを代入

    cnt=${c-9}

    cntにcの値を代入

    ${variable:=word}

    variableを変数として定義しかつ値を代入している場合,variableの値を返します。

    variableは定義されていてNULLまたは未定義の場合,wordの展開結果をvariableに代入し,variableの値を返します。ただし,この書式は変数だけに使用でき,位置パラメーターには使用できません。

    cnt=${a:=7}

    aに7を代入し,cntにaの値を代入

    cnt=${b:=8}

    bに8を代入し,cntにbの値を代入

    cnt=${c:=9}

    cntにcの値を代入

    ${variable=word}

    variableを変数として定義しかつ値を代入している場合,variableの値を返します。

    variableは定義されていてNULLの場合,variableの値(NULL)を返します。

    variableが未定義の場合,wordの展開結果をvariableに代入し,variableの値を返します。ただし,この書式は変数だけに使用でき,位置パラメーターには使用できません。

    cnt=${a=7}

    cntに7を代入

    cnt=${b=8}

    cntにNULLを代入

    cnt=${c=9}

    cntにcの値を代入

    ${variable:?[word]}

    variableを変数として定義しかつ値を代入している場合,variableの値を返します。

    wordを指定し,かつvariableは定義されていてNULLまたは未定義の場合,wordの展開結果を標準エラー出力に出力し,ジョブ定義スクリプトは終了します。

    wordを省略し,かつvariableは定義されていてNULLまたは未定義の場合,未定義を表すKNAX6050-Eメッセージを出力し,ジョブ定義スクリプトは終了します。

    variableの値は変更しません。

    cnt=${a:?7}

    展開結果を標準エラー出力に出力し,シェル終了

    cnt=${a:?}

    メッセージを出力し,シェル終了

    cnt=${b:?8}

    展開結果を標準エラー出力に出力し,シェル終了

    cnt=${c:?9}

    cntにcの値を代入

    ${variable?[word]}

    variableを変数として定義しかつ値を代入している場合,variableの値を返します。

    variableは定義されていてNULLの場合,variableの値(NULL)を返します。

    wordを指定し,かつvariableが未定義の場合,wordの展開結果を標準エラー出力に出力し,ジョブ定義スクリプトは終了します。

    wordを省略し,かつvariableが未定義の場合,未定義を表すKNAX6050-Eメッセージを出力し,ジョブ定義スクリプトは終了します。

    variableの値は変更しません。

    cnt=${a?7}

    展開結果を標準エラー出力に出力し,シェル終了

    cnt=${a?}

    メッセージを出力し,シェル終了

    cnt=${b?8}

    cntにNULLを代入

    cnt=${c?9}

    cntにcの値を代入

    ${variable:+word}

    variableを変数として定義しかつ値を代入している場合,wordの展開結果を返します。それ以外の場合は,NULLを返します。

    variableの値は変更しません。

    cnt=${a:+7}

    cntにNULLを代入

    cnt=${b:+8}

    cntにNULLを代入

    cnt=${c:+9}

    cntに9を代入

    ${variable+word}

    variableを変数として定義しかつ値を代入している場合またはNULLの場合,wordの展開結果を返します。それ以外の場合は,NULLを返します。

    variableの値は変更しません。

    cnt=${a+7}

    cntにNULLを代入

    cnt=${b+8}

    cntに8を代入

    cnt=${c+9}

    cntに9を代入

  • 変数の値の文字列長や配列の要素数への変数置換

    変数の値の文字列長,および配列の要素数への変数置換の書式を次の表に示します。variableには変数名,arrayには配列名を指定します。

    表5‒11 変数の値の文字列長および配列の要素数への変数置換の書式

    書式

    説明

    ${#variable}

    variableが「*」または「@」の場合,位置パラメーターの番号に置換されます。それ以外の場合は,環境設定パラメーターVAR_SHELL_GETLENGTHの指定に応じて次のように置換されます。

    • BYTE

      variableに格納されている値の長さをバイト数に置換

    • CHARACTER

      variableに格納されている値の長さを文字数に置換

    環境設定パラメーターVAR_SHELL_GETLENGTHが指定されていない場合は,環境設定パラメーターVAR_SHELL_GETLENGTHにBYTEを指定した場合と同じ動作となります。

    ${#array[*]}

    arrayで指定された配列の要素数に置換されます。

    ${#array[@]}

    ${#array[n][*]}

    array[n][*]で指定された配列の行の要素数に置換されます。

    ${#array[n][@]}

    array[n][@]で指定された配列の行の要素数に置換されます。

    ${#array[*][m]}

    array[*][m]で指定された配列の列の要素数に置換されます。

    ${#array[@][m]}

    array[@][m]で指定された配列の列の要素数に置換されます。

    ${#array[*][*]}

    arrayで指定された配列の要素数に置換されます。

    ${#array[@][@]}

    ${?MAX:array}

    arrayで指定された配列の最大行数(1次元配列)と最大列数(2次元配列)に置換される。

    • ${#array[*]}書式の使用例

      ARRAY=(a b c d e f g h i j k l m n o)
      echo ${#ARRAY[*]}

      →15

    • ${#array[n][*]}書式の使用例

      ARRAY[]=({ a b c d e } { f g h i j } { k l m n o })
      echo ${#ARRAY[1][*]}

      →5

    • ${#array[*][m]}書式の使用例

      ARRAY[]=({ a b c d e } { f g h i j } { k l m n o })
      echo ${#ARRAY[*][1]}

      →3

    • ${#array[*][*]}書式の使用例

      ARRAY[]=({ a b c d e } { f g h i j } { k l m n o })
      echo ${#ARRAY[*][*]}

      →15

    • ${?MAX:array}書式の使用例

      ARRAY[]=({ a1 a2 a3 a4 a5 } { b1 b2 b3 b4 b5 } { c1 c2 c3 c4 c5 } \
               { d1 d2 d3 d4 d5 } { e1 e2 e3 e4 e5 } { f1 f2 f3 f4 f5 } \
               { g1 g2 g3 g4 g5 } { h1 h2 h3 } { i1 i2 i3 i4 })
      
      unset ARRAY[2][3]
      ARRAY[2][5]=c6
      echo ${?MAX:ARRAY}

      →9 6

      n※1

      m※2

      0

      1

      2

      3

      4

      5

      0

      a1

      a2

      a3

      a4

      a5

      -

      1

      b1

      b2

      b3

      b4

      b5

      -

      2

      c1

      c2

      -

      c4

      c5

      c6

      3

      d1

      d2

      d3

      d4

      d5

      -

      4

      e1

      e2

      e3

      e4

      e5

      -

      5

      f1

      f2

      f3

      f4

      f5

      -

      6

      g1

      g2

      g3

      g4

      g5

      -

      7

      h1

      h2

      h3

      -

      -

      -

      8

      i1

      i2

      i3

      -

      -

      -

      注※1

      1次元配列要素番号を示します。

      注※2

      2次元配列要素番号を示します。

  • パターンマッチングの結果によって実行される変数置換

    パターンマッチングの結果によって実行される変数置換の書式を次の表に示します。variableには変数名,patternにはvariableとパターンマッチングを行う文字列を指定します。patternにはワイルドカードによる指定もできます。

    表5‒12 パターンマッチングの結果によって実行される変数置換の書式

    分類

    書式

    説明

    前方一致

    ${variable#pattern}

    patternが変数の値の先頭と一致する場合,一致する部分で最も短い部分を削除した値に置換します。それ以外の場合はvariableの値に置換します。

    ${variable##pattern}

    patternが変数の値の先頭と一致する場合,一致する部分で最も長い部分を削除した値に置換します。それ以外の場合はvariableの値に置換します。

    後方一致

    ${variable%pattern}

    patternが変数の値の終端と一致する場合,一致する部分で最も短い部分を削除した値に置換します。それ以外の場合はvariableの値に置換します。

    ${variable%%pattern}

    patternが変数の値の終端と一致する場合,一致する部分で最も長い部分を削除した値に置換します。それ以外の場合はvariableの値に置換します。

    変数の値を文字列指定(前方一致)で削除し出力する場合の実行例を次に示します。

    ジョブ定義スクリプトの内容

    abc=abcd1234xyz987abcd1234efg
    echo ${abc#abcd}         # 1.
    echo ${abc#a*2}          # 2.
    echo ${abc##a*2}         # 3.
    echo ${abc#*1234}        # 4.
    echo ${abc##*1234}       # 5.
    echo ${abc#1234}         # 6.

    実行ジョブのSTDOUTファイルの内容

    ********   実行ジョブのSTDOUTファイルの内容    ********
    1234xyz987abcd1234efg      ←1.の結果 先頭のabcdを削除
    34xyz987abcd1234efg        ←2.の結果 a…2の文字列を削除(最短一致)
    34efg                      ←3.の結果 a…2の文字列を削除(最長一致)
    xyz987abcd1234efg          ←4.の結果 先頭…1234の文字列削除(最短一致)
    efg                        ←5.の結果 先頭…1234の文字列削除(最長一致)
    abcd1234xyz987abcd1234efg  ←6.の結果 先頭が一致しないためabcの値を出力

    変数の値を文字列指定(後方一致)で削除し出力する場合の実行例を次に示します。

    ジョブ定義スクリプトの内容

    abc=abcd1234xyz987abcd1234
    echo ${abc%1234}         # 1.
    echo ${abc%d*4}          # 2.
    echo ${abc%%d*4}         # 3.
    echo ${abc%34*}          # 4.
    echo ${abc%%34*}         # 5.
    echo ${abc%abcd}         # 6.

    実行ジョブのSTDOUTファイルの内容

    ********   実行ジョブのSTDOUTファイルの内容    ********
    abcd1234xyz987abcd     ←1.の結果 最後尾の1234を削除
    abcd1234xyz987abc      ←2.の結果 d…4の最後尾の文字列を削除(最短一致)
    abc                    ←3.の結果 d…4の最後尾の文字列を削除(最長一致)
    abcd1234xyz987abcd12   ←4.の結果 34以降の文字列を削除(最短一致)
    abcd12                 ←5.の結果 34以降の文字列を削除(最長一致)
    abcd1234xyz987abcd1234 ←6.の結果 最後尾が一致しない場合abcの値を出力
  • 部分文字列展開

    部分文字列展開の結果によって実行される変数置換の書式を次の表に示します。

    表5‒13 部分文字列展開の書式

    書式

    説明

    ${variable:offset}

    variableの展開結果から文字を取り出します。取り出す文字の先頭位置はoffsetで指定します。

    ${variable:offset:length}

    variableの展開結果から最大length文字を取り出します。取り出す文字の先頭位置はoffsetで指定します。

    ${array[*]:offset}

    配列の${array[offset]}を先頭とする要素を取り出します。

    ${array[*]:offset:length}

    配列の${array[offset]}を先頭とする要素をlength個取り出します。

    ${array[@]:offset}

    配列の${array[offset]}を先頭とする要素を取り出します。

    ${array[@]:offset:length}

    配列の${array[offset]}を先頭とする要素をlength個取り出します。

    ${array[*][m]:offset}

    配列の${array[offset][m]}を先頭とするm列の要素を取り出します。

    ${array[*][m]:offset:length}

    配列の${array[offset][m]}を先頭とするm列の要素をlength個取り出します。

    ${array[n][*]:offset}

    配列の${array[n][offset]}を先頭とする行の要素を取り出します。

    ${array[n][*]:offset:length}

    配列の${array[n][offset]}を先頭とする行の要素をlength個取り出します。

    ${array[@][m]:offset}

    配列の${array[offset][m]}を先頭とするm列の要素を取り出します。

    ${array[@][m]:offset:length}

    配列の${array[offset][m]}を先頭とするm列の要素をlength個取り出します。

    ${array[n][@]:offset}

    配列の${array[n][offset]}を先頭とする行の要素を取り出します。

    ${array[n][@]:offset:length}

    配列の${array[n][offset]}を先頭とする行の要素をlength個取り出します。

    ${array[*][*]:offset}

    配列の${array[offset]}を先頭とする要素を取り出します。

    ${array[*][*]:offset:length}

    配列の${array[offset]}を先頭とする要素をlength個取り出します。

    ${array[@][@]:offset}

    配列の${array[offset]}を先頭とする要素を取り出します。

    ${array[@][@]:offset:length}

    配列の${array[offset]}を先頭とする要素をlength個取り出します。

    (凡例)

    variable:変数名を指定します。

    array:配列名を指定します。

    offset:部分展開する文字列および配列要素の先頭位置を指定します。

    length:展開する文字数および配列要素数を指定します。

    n:2次元配列の行を指定します。

    m:2次元配列の列を指定します。

    • ${array[*]:offset}書式の使用例

      ARRAY=(a b c d e f g h i j k l m n o)
      echo ${ARRAY[*]:3}

      →d e f g h i j k l m n o

    • ${array[*]:offset:length}書式の使用例

      ARRAY=(a b c d e f g h i j k l m n o)
      echo ${ARRAY[*]:3:3}

      →d e f

    • ${array[*][m]:offset}書式の使用例

      ARRAY[]=({ a b c d e } { f g h i j } { k l m n o } { p q r s t })
      echo ${ARRAY[*][1]:1}

      →g l q

    • ${array[*][m]:offset:length}書式の使用例

      ARRAY[]=({ a b c d e } { f g h i j } { k l m n o } { p q r s t })
      echo ${ARRAY[*][1]:1:2}

      →g l

    • ${array[n][*]:offset}書式の使用例

      ARRAY[]=({ a b c d e } { f g h i j } { k l m n o } { p q r s t })
      echo ${ARRAY[1][*]:1}

      →g h i j

    • ${array[n][*]:offset:length}書式の使用例

      ARRAY[]=({ a b c d e } { f g h i j } { k l m n o } { p q r s t })
      echo ${ARRAY[1][*]:1:2}

      →g h

    • ${array[*][*]:offset}書式の使用例

      ARRAY[]=({ a b c d e } { f g h i j } { k l m n o } { p q r s t })
      echo ${ARRAY[*][*]:3}

      →d e f g h i j k l m n o p q r s t

    • ${array[*][*]:offset:length}書式の使用例

      ARRAY[]=({ a b c d e } { f g h i j } { k l m n o } { p q r s t })
      echo ${ARRAY[*][*]:3:3}

      →d e f

(b) コマンド置換

コマンド置換の書式を次の表に示します。commandには実行するコマンド名および引数を指定します。

Windowsの場合,CMDSUB_PROCESSパラメーターにCURRENTを指定すると,コマンド置換は外部コマンドを除いてカレントプロセスで実行されます(デフォルト値はCURRENTです)。

表5‒14 コマンド置換の書式

書式名

書式

説明

$( )形式

$(command)

commandの文字列に「\」が含まれていても「\」は意味を持ちません。

逆引用符形式

`command`

commandの文字列に「\」が含まれていると「\」は意味を持ちます。

コマンド置換の中にコマンド置換を記述する場合,`command \`command\``のように内側の逆引用符の直前に「\」を記述してください。

逆引用符形式ではcommandの文字列内の「\」はメタキャラクタとして扱われるため,$( )形式と逆引用符形式では,commandの文字列に「\」が含まれている場合の実行結果が異なります。そのため,$( )形式の使用をお勧めします。

実行例および実行結果を次に示します。

  • $( )形式の場合

    実行例

    VAL=$(echo '\$x')

    実行結果(VALに代入される値)

    \$x
  • 逆引用符形式の場合

    実行例

    VAL=`echo '\$x'`

    実行結果(VALに代入される値)

    $x

次のときコマンド置換はデータの受け渡しのために一時ファイルを使用します。

  • Windowsの場合

    CMDSUB_PROCESSパラメーターにCURRENTを指定したとき(デフォルト値)。

  • UNIXの場合

    COMPATIBLE_CMDSUBパラメーターと同時に,PIPE_CMD_LASTパラメーターにCURRENTを指定した環境で,パイプ(|)でつながれた1つのコマンド群だけをコマンド置換したとき。例を次に示します。

    例:

    • 次の処理の場合,cmd2によって標準出力に出力されるデータは,一時ファイルに出力されてから,ジョブ定義スクリプト中に文字列として展開されます。

      `cmd1 | cmd2`
    • 次の処理の場合は,コマンド群が2つあるため,一時ファイルは作成されません。

      `cmd1 | cmd2; cmd3 | cmd4`

    一時ファイルは,環境設定パラメーターTEMP_FILE_DIRで指定された場所に作成します。

CMDSUB_PROCESSパラメーターについては,「7. 環境ファイルで設定するパラメーター」の「7.3.11 CMDSUB_PROCESSパラメーター(コマンド置換の実行プロセスを定義する)【 Windows 限定】」を参照してください。

COMPATIBLE_CMDSUBパラメーターについては,「7. 環境ファイルで設定するパラメーター」の「7.3.14 COMPATIBLE_CMDSUBパラメーター(コマンド置換の動作を定義する)【UNIX限定】」を参照してください。

(c) ファイル名置換

ファイル名置換の書式を次の表に示します。patternはパターンマッチングを行う文字列を指定します。patternにはワイルドカードによる指定もできます。

表5‒15 複数パターンによるファイル名置換の書式

書式

意味

使用例

一致する文字列

?(pattern|pattern ...)

patternに指定された文字列のうち,どれか1つと合致します。

?(h)

空文字列,h

*(pattern|pattern ...)

patternに指定された文字列のうち,0または1つ以上と合致します。

*(h)

空文字列,h,h,hh,hhh,…

+(pattern|pattern ...)

patternに指定された文字列のうち,1つ以上と合致します。

+(h)

h,hh,hhh,…

@(pattern|pattern ...)

patternに指定された文字列のうち,1つだけ合致します。

@(h)

h

!(pattern|pattern ...)

patternに指定された文字列のうち,1つを除くすべてと合致します。

!(h)

hを除く任意の文字列

1つ以上のパターンを「|」で区切ることで,複数のパターンを同時に指定し,合致するファイル名を置換できます。ただし,パターンの区切り文字である「|」の前後にスペースを挿入しないでください。また,パターンの前後にスペースを挿入した場合,スペースもパターンの一部として扱われます。

使用例を次に示します。

ファイル名置換の使用例
ジョブ定義スクリプトの内容
ls -C                     # 1.カレントディレクトリに存在するファイルを表示
ls -C ?(*.sh|*.exe|*.dot) # 2.拡張子がsh,exec,dotのどれかのファイル名を表示
ls -C *(*.sh|*.exe)       # 3.拡張子がsh,exeのどちらかのファイル名を表示
ls -C +(*.jhs|*h)         # 4.拡張子がjhsまたは終端がhのファイル名を表示
ls -C @(*.c|*.jhs)        # 5.拡張子がcまたはjhsのファイル名を表示
ls -C !(*.c|*.jhs)        # 6.拡張子cまたはjhs以外のファイル名を表示
実行ジョブのSTDOUTファイルの内容
********   実行ジョブのSTDOUTファイルの内容    ********
a.jhs  a.sh  a.txt  func.c  ←1.の実行結果 
a.sh                        ←2.の実行結果 
a.sh                        ←3.の実行結果
a.jhs  a.sh                 ←4.の実行結果
a.jhs  func.c               ←5.の実行結果
a.sh  a.txt                 ←6.の実行結果

ファイル名の先頭文字がドット(.)の場合は,パターンとの合致対象から外されます。先頭文字がドットのファイル名をパターンとの合致対象に含める場合は,明示的にドットを指定する必要があります。

(7) 算術展開

算術展開とは,算術をした上でその結果に置き換えることです。算術展開の書式と実行例を次に示します。

$((算術式))
算術展開の実行例
ジョブ定義スクリプトの内容
x=100          # 1.xに代入されている値は100
x=$((x-1))     # 2.算術を実行し,その結果をxに代入する
echo $x        # 3.変数xの値を標準出力へ出力する
実行ジョブのSTDOUTファイルの内容
********   実行ジョブのSTDOUTファイルの内容    ********
99             ←xに代入されている値は99

(8) 入出力リダイレクト

ジョブ定義スクリプトでは,コマンド実行前に実行結果の出力先の変更やコマンド実行に必要な情報の入力先を変更できます。これを入出力リダイレクトといいます。JP1/Advanced Shellで使用できる入出力リダイレクトについて説明します。

(a) リダイレクト

使用例(2次元配列)JP1/Advanced Shellで使用できるリダイレクトを次の表に示します。リダイレクトは左から右に解釈されます。

表5‒16 JP1/Advanced Shellで使用できるリダイレクト

リダイレクト

意味

>file

fileを標準出力として使用します。fileが存在しない場合は,ファイルを作成します。すでにfileが存在する場合は,上書きします。※1

< file

fileを標準入力として使用します。※1

command_1 | command_2

パイプです。command_1の標準出力をcommand_2の標準入力とします。

>>file

fileを標準出力として使用します。fileが存在しない場合は,ファイルを作成します。すでにfileが存在する場合は,追記します。※1

>|file

fileを標準出力として使用します。fileが存在しない場合は,ファイルを作成します。すでにfileが存在する場合は,上書きします。※1

<>file

fileを読み取りと書き込みのために標準入力としてオープンします。※1

<<label

ヒアドキュメントです。

n>file

n番のファイルディスクリプタの出力先をfileにします。※1

n<file

n番のファイルディスクリプタはfileから入力します。※1

>&n

標準出力をn番ファイルディスクリプタにコピーします。

<&n

標準入力をn番ファイルディスクリプタからコピーします。

>&-

標準出力をクローズします。

<&-

標準入力をクローズします。

|&※2

親プロセスからの入出力を伴うバックグラウンドプロセスを起動します。

>&p※3

コマンドの出力先をバックグラウンドプロセスにリダイレクトします。

<&p※3

コマンドへの入力をバックグラウンドプロセスにリダイレクトします。

注※1

fileにシンボリックリンクを指定した場合はリンク先が入出力の対象となります。なお,出力のためのリダイレクト(>,>>,>|,<>)に対して,リンク先が存在しないシンボリックリンクを指定した場合,UNIX版とWindows版で動作が異なります。

UNIX版

リンク先にファイルを作成します。

Windows版

ファイルに対するシンボリックリンクの場合はリンク先にファイルを作成します。ディレクトリに対するシンボリックリンクの場合はファイルの作成に失敗します。

注※2

|&」を使用して,親プロセスからの入出力を伴うバックグラウンドプロセスを複数起動しようとすると,KNAX6029-Eメッセージが出力され,ジョブ定義スクリプトがエラー終了する場合があります。そのため,「|&」を使用する場合は,waitコマンドなどを使用し,バックグラウンドプロセスを複数同時に起動しないようにしてください。

注※3

UNIX版では,バックグラウンドプロセスへの入力を異なるファイルディスクリプタに再割り当てすることで,複数のバックグラウンドプロセスを起動できます。Windows版では,バックグラウンドプロセスへの入力を異なるファイルディスクリプタに再割り当てしても,2つ以上バックグラウンドプロセスを起動できません。

(b) ファイルディスクリプタ

JP1/Advanced Shellのジョブコントローラの入出力種別ごとのファイルディスクリプタを次の表に示します。

表5‒17 JP1/Advanced Shellの入出力種別ごとのファイルディスクリプタ

入出力種別

ファイルディスクリプタ

備考

標準入力

0

標準出力

1

次の場合は,ジョブコントローラプロセス起動時の標準出力を継承します。

  • 簡潔出力モードまたは最小出力モードで動作する場合

  • 環境ファイルのOUTPUT_STDOUTパラメーターにPARENTを指定した場合(デフォルトの動作です)

  • adshexecコマンドの-sオプションにPARENTを指定した場合

それ以外の場合は,ジョブコントローラがスプールのSTDOUTへの出力(stdout)として使用しているため,このファイルディスクリプタで端末をオープンしていません。

標準エラー出力

2

次の場合は,ジョブコントローラプロセス起動時の標準エラー出力を継承します。

  • 簡潔出力モードまたは最小出力モードで動作する場合

それ以外の場合は,ジョブコントローラがスプールのSTDERRへの出力(stderr)として使用しているため,このファイルディスクリプタで端末をオープンしていません。

上記以外

39

ユーザーがジョブ定義スクリプト内で使用できるファイルディスクリプタです。

(凡例)

−:特になし。

(c) ヒアドキュメント

ヒアドキュメントとは,標準入力をジョブ定義スクリプト内で生成することです。ヒアドキュメントに関する書式を次の表に示します。なお,ヒアドキュメントではデータの受け渡しに一時ファイルを使用します。一時ファイルは,環境設定パラメーターTEMP_FILE_DIRで指定されたディレクトリに作成します。

表5‒18 ヒアドキュメントに関する書式

書式

意味

<< label

document

label

labelに囲まれたdocumentの部分が標準入力に渡されます。documentの部分に記述された変数は置換され,スペース,タブ文字はそのまま標準入力に渡されます。

<<- label

document

label

labelに囲まれたdocumentの部分が標準入力に渡されます。documentの部分に記述された変数は置換され,スペースはそのまま標準入力に渡されます。しかし,各行の行頭のタブ文字は削除されます。

<< \label

document

label

labelに囲まれたdocumentの部分が標準入力に渡されます。documentの部分に記述された変数は置換されません。

<< 'label'

document

label

(d) パイプ

複数のコマンドを接続し,1つのコマンドの標準出力を別のコマンドの標準入力として使用したい場合に,パイプでコマンドを接続します。パイプで接続されたコマンドのセットをパイプラインと呼びます。

パイプラインは左から右へ処理が実行されます。最後のコマンドをカレントプロセスと別プロセスのどちらで実行するかはPIPE_CMD_LASTパラメーターで定義できます。デフォルトはカレントプロセスです。

注※

別プロセスで実行するコマンド(外部コマンド,子孫ジョブ,UNIX互換コマンド,シェル運用コマンド,サブシェル,バックグラウンド指定のコマンド,バックグラウンドプロセス指定のコマンド)は除きます。

  • Windowsの場合

    パイプラインのコマンドはカレントプロセスで逐次的に実行して,コマンド間のデータの受け渡しに一時ファイルを使用します。また,一時ファイルは環境設定パラメーターTEMP_FILE_DIRで指定されたディレクトリに作成します。パイプラインのコマンドを別々のプロセスとして実行したい場合は,PIPE_CMD_LASTパラメーターで定義できます。

    入力側のコマンドが実行終了してプロセスが存在しない状態で出力側のコマンドがパイプへ出力すると,出力側のコマンドはエラー終了します。

  • UNIXの場合

    パイプラインのコマンドは別々のプロセスとして実行されます。

    複数のコマンドをパイプで接続して実行する場合,入力側のコマンドが実行終了してプロセスが存在しない状態で,出力側のコマンドがパイプへ出力すると,出力側のコマンドがSIGPIPEを受信する場合があります。

    ジョブコントローラでは,コマンドがSIGPIPEをハンドリングしている場合を除き,KNAX6522-Eメッセージを出力してエラー終了します。

PIPE_CMD_LASTパラメーターについては,「7. 環境ファイルで設定するパラメーター」の「7.3.38 PIPE_CMD_LASTパラメーター(パイプの最終コマンドの実行プロセスを定義する)」を参照してください。

(9) コマンドセパレータ

コマンドセパレータを使用すると,ジョブ定義スクリプトの1行に複数のコマンドを記述できます。コマンドセパレータに関する書式を次の表に示します。

表5‒19 コマンドセパレータに関する書式

書式

意味

command;

セミコロン(;)までをコマンドおよびコマンド引数として解釈します。

command_10&&△0command_2

AND制御演算子です。左項のコマンドが終了コード0で終了すると,右項のコマンドを実行します。

command_10||0command_2

OR制御演算子です。左項のコマンドが終了コード0以外で終了すると,右項のコマンドを実行します。

また,コマンドセパレータは,グループ化したコマンドを1つのコマンド群として扱い,実行できます。

(10) コマンドのグループ化

コマンドをグループ化すると,複数のコマンドをまとめて実行できます。また,グループ化したコマンド群をグループ化することもできます。コマンドのグループ化に関する書式を次の表に示します。

表5‒20 コマンドのグループ化に関する書式

書式

意味

(command_1;△0command_2; ... )

別プロセスでグループ化されたコマンドを実行します。コマンド実行中に環境を変更しても変更内容はカレントシェルに引き継がれません。グループ化するコマンドはセミコロンまたは改行文字で区切ります。

(command_1(改行)

command_2(改行)

... )

{△1command_1;△0command_2; ...;}

カレントプロセスでグループ化されたコマンドを実行します。コマンド実行中に環境を変更すると変更内容がコマンド終了後も引き継がれます。グループ化するコマンドはセミコロンまたは改行文字で区切ります。

この書式の場合,「{」の後ろに1つ以上のスペースを挿入しかつ最後のコマンドにセミコロン(;)または改行文字を挿入してください。

{△1command_1(改行)

command_2(改行)

...(改行)

}

(11) そのほかのメタキャラクタ

そのほかに,次の表に示すメタキャラクタが使用できます。

表5‒21 使用できるメタキャラクタ

メタキャラクタ

意味

~※1

シェル変数のHOME※2に置き換えられます。

~任意の文字列

【UNIX限定】

/または引数区切り文字までの文字列と一致するユーザー名が/etc/passwdファイルに登録されているか確認します。

登録されている場合は,一致するユーザーのログインディレクトリに置き換えられます。

登録されていない場合は,そのままの文字列として解釈されます。

~+※1

シェル変数のPWDに置き換えられます。

~-※1

シェル変数のOLDPWDに置き換えられます。

&

ジョブ定義スクリプトや関数をバックグラウンドで実行します。

注※1

「~」,「~+」および「~-」は,クォーテーションで囲んだり,クォーテーションで囲まれた文字列やエスケープ文字(\)の直前に記述されたりすると,対応するシェル変数に置き換わりません。このような場合はシェル変数を使用してください。

注※2

シェル変数のHOMEは自動では設定されません。環境変数として定義してください。