Hitachi

JP1 Version 11 JP1/Advanced Shell 


5.1.2 変数

変数とはジョブ定義スクリプト内で値を代入する領域のことです。変数の作成および変数の値を参照できます。また,変数は,エクスポートによって子プロセスに環境変数として引き継がせることができます。変数のことをシェル変数ともいいます。

〈この項の構成〉

(1) 変数の命名規則

作成する変数の名称は,命名規則の範囲で任意に指定できます。また,英字は大文字と小文字を区別するため,同じスペルであっても異なる変数名になります。

ただし,Windows環境で小文字が含まれる変数をエクスポートし,環境変数として使用しようとすると,VAR_ENV_NAME_LOWERCASEパラメーターの指定によってはエラーとなります。

変数の命名規則を次に示します。環境変数の命名規則については「(a) 環境変数の命名規則【Windows限定】」を参照してください。

(a) 環境変数の命名規則【Windows限定】

VAR_ENV_NAME_LOWERCASEパラメーターの指定によって,使用できる環境変数名は次のように異なります。

  • VAR_ENV_NAME_LOWERCASEパラメーターにDISABLEを指定した場合

    小文字を含む環境変数名は使用できません。

    小文字が含まれる変数名をエクスポートしようとするとエラーとなります。

  • VAR_ENV_NAME_LOWERCASEパラメーターにENABLEを指定した場合

    小文字を含む環境変数名を使用できます。ただし,「ADSH」から始まる環境変数名は小文字では定義しないでください。

    指定時の注意事項を次に示します。

    • ジョブ定義スクリプトで小文字のシェル変数名をエクスポートした場合,そのあと呼ばれる外部コマンドには,環境変数名が小文字のまま渡ります。Windowsでは大文字と小文字を区別しないため,スペルが同じ環境変数名を同一と解釈し,最後にエクスポートした値が環境変数として渡されます。しかし,シェル変数は大文字・小文字が区別されるため,それぞれ別の値を保持するので,注意してください。

      例えば,次の指定では環境変数名の「ABC」と「abc」は区別されないため,最初は環境変数値として「lowercase」が設定されますが,最後に「uppercase」が設定されます。

      export abc=lowercase

      export ABC=uppercase

    • シェル変数をエクスポートした場合,そのシェル変数のスコープ内で同じスペルのシェル変数のexport属性は無効になります。配列でもすべての要素のexport属性が無効になります。

      ただし,スコープ外でエクスポートされていた変数と同じスペルの関数ローカル変数をエクスポートした場合は,export属性は無効になりません。

コマンドやパラメーターで小文字を指定できるかどうかは,VAR_ENV_NAME_LOWERCASEパラメーターの設定によって次のように異なります。

コマンドまたはパラメーター

VAR_ENV_NAME_LOWERCASEパラメーターの設定値

DISABLE

ENABLE

exportパラメーター(環境設定パラメーター)

大文字・小文字を指定できるが,区別はされない。

同左

exportコマンド,

typeset -xコマンド

小文字のシェル変数名は指定できない。

小文字のシェル変数名も指定できるが,環境変数名の大文字・小文字は区別されない。

ただし,シェル変数としては大文字・小文字は区別され,別のシェル変数と見なされる。

setコマンド

-aオプション)

setコマンド以降のシェル変数をすべてエクスポートするが,小文字のシェル変数に値を設定するとエラーになる。

setコマンド以降のシェル変数をすべてエクスポートするが,小文字のシェル変数でも値を設定すると,そのシェル変数がエクスポートされる。

ただし,環境変数名の大文字・小文字は区別されない。

unsetコマンド,

readonlyコマンド,

readコマンド

シェル変数名なので小文字を指定できる。

同左

#-adsh_fileコマンド,

#-adsh_file_tempコマンド,

#-adsh_spoolfileコマンド

ファイル環境変数定義名には小文字を指定できない。

ファイル環境変数定義名に小文字を指定できる。

ただし,環境変数名の大文字・小文字は区別されない。

#-adsh_step_startコマンド

ジョブステップ名はステップの戻り値を格納するシェル変数名に使用されるが,小文字を指定できる。

-stepVarで指定するシェル変数名は小文字を指定できる。

同左

#-adsh_path_varコマンド

変数名に小文字を指定できる。

同左

スクリプト拡張コマンドの{環境変数名}による置換

環境変数名に小文字を指定できる。

同左

GUIデバッガでウォッチするシェル変数

シェル変数名に小文字を指定できる。

同左

adshreadコマンド

adshvarconvコマンド

シェル変数名に小文字を指定できる。

同左

for シェル変数

シェル変数名に小文字を指定できる。

同左

awkコマンドのENVIRON組み込み変数

添え字に環境変数名を指定できるが,小文字も指定できる。

同左

adshjavaコマンドのバッチアプリケーションに渡す引数

システムプロパティで環境変数名を指定できるが,adshjavaコマンドは文字種別をチェックしない。

同左

稼働実績情報取得機能で採取する環境変数

環境変数名と値を採取するが,環境変数名の文字種別をチェックしない。

同左

PATH_CONV_VARパラメーター

PATH_CONV_NOVARパラメーター

シェル変数名に小文字を指定できる。

同左

(2) 変数の作成と値の代入

変数を作成,および値を代入する場合の書式を次に示します。

変数名=

変数は=の左項に変数名を記述することで作成されます。作成された変数には,値の書き込みおよび値の読み込みができます。変数に値を代入する場合は,=の右項に値を記述します。変数は次の点に注意して作成してください。

(3) 変数の値の参照

(a) 参照方法

変数の値を参照する場合の書式を次に示します。

$変数名
または
${変数名}

変数に代入された値は,変数名に$を付けることで参照できます。参照する変数は変数名と完全に一致した変数が対象となります。ただし,変数名に使用できない文字を指定した場合,それまでの文字を変数名と認識し処理をします。

参照する変数名の文字列に,変数名には指定できない文字を指定した場合の実行例
abc=xxx
echo $abc@zzz

→xxx@zzzが標準出力に出力されます。

また,参照する変数名を明示的に指定したい場合は,変数名を{ }で囲むことで参照できます。ただし,{ }で囲った場合は,変数名に使用できない文字が含まれていても変数名の一部として扱い処理をします。

変数abcを明示的に指定し,参照する場合の実行例
abc=xxx
abcdef=yyy
echo ${abc}def

→xxxdefが標準出力に出力されます。

(b) offset(参照起点)とlength(参照長)を指定した参照方法

offset(参照起点)とlength(参照長)を指定して変数の値を参照する場合の書式を次に示します。

${変数名:offset}

または

${変数名:offset:length}

または

${変数名::length}

参照する変数に代入された値の特定の部分を参照したい場合,変数名に続けて「:offset」または「:offset:length」を指定します。

offsetlengthには変数名の命名規則に示されている文字および数値以外は指定できません。offsetlengthに指定する変数名および数値は,次の規則に従い記述してください。

指定値

指定規則

数値(符号なし)の場合

指定値の前後にはスペース,タブは指定できません。

数値(符号あり)の場合

符号の直前にはスペースを指定する必要があります。それ以外の指定値の前後にはスペース,タブは指定できません。

変数の場合

指定値の前後にはスペース,タブは指定できません。

offsetの指定省略の場合

スペースの指定はできますが,タブの指定はできません。

複数行にわたって記述する場合,行の終端に\を付けて改行できます。

offsetlengthに指定できる数値の範囲を次に示します。

種類

指定範囲(単位:文字)

指定例

offset

-65535〜65535

0を指定した場合,文字列の先頭から出力されます。

正の値を指定した場合,文字列の先頭+1番目を起点として出力されます。

負の値を指定した場合,文字列の終端から数えた位置が起点となります。

(例)

文字列数10のデータに対し,offsetに0,3,または-1を指定した場合の参照先を次に示します。

[図データ]

length

0〜65536

(例)

文字列数10のデータに対し,offset=3,length=3を指定した場合,出力できる文字の範囲は次の図の太線で囲まれた部分です。

[図データ]

注※

数値は次のどちらかの方法で指定できます。

  • 8進数,10進数,16進数の数値

    指定した数値は次のように自動判別されます。

    ・0xから始まる文字列(0xa)は,16進数と判別されます。

    ・0から始まる文字列(012)は,8進数と判別されます。

    ・8進数でも16進数でもない数値は,10進数と判別されます。

    ・-0は,0を指定した場合と同等に扱われます。

    ・数値に符号(「-」または「+」)を付けた場合,「:」と符号との間には1つ以上のスペースを入れる必要があります。

  • 数値を代入した変数名

    指定した変数名の変数が存在しない場合,または変数に代入値が指定されていない場合は,変数値には0が仮定されます。

    複数の変数を再帰的に参照する変数名を指定した場合,offsetの再帰回数が1,024回,lengthの再帰回数が1,025回を超えると,エラーになります。

offsetおよびlengthの指定に関する注意事項を次に示します。

  • 次の指定は構文エラーとなります。

    • offsetまたはlengthに,数値でも変数名でもない文字列を指定した場合

      echo ${ABC:123D}

      →「123D」は数値でも変数名でもないためエラーとなる

    • offsetまたはlengthに指定した変数名に,数値でも変数名でもない文字列が設定されている場合

      CNT=123D

      echo ${ABC:CNT}

      →指定した変数の値「123D」は数値でも変数名でもないためエラーとなる

    • offsetを不当に省略した場合

      echo ${ABC:}

      offsetの指定がないため,エラーとなる

    • offsetおよびlengthに算術式を指定した場合

      echo ${ABC:10-2}

      →算術式が指定されているため,エラーとなる

    • offsetおよびlengthに指定した変数に$や${}を付けた場合

      ABC=abcdefghijklmn

      AA=1

      echo ${ABC:$AA}

      offsetおよびlengthに指定する変数に$や${}を付けているため,エラーとなる

    • offsetの直前またはlengthの直前にタブを指定した場合

      (次の例ではoffsetの直前にタブを指定しています。「→」はタブを示します)

      ABC=abcdefghijklmn

      AA=1

      BB=1

      echo ${ABC:→AA:BB}

      offsetの直前にタブを指定しているため,エラーとなる

  • offsetまたは変数に設定されている数値が,変数に設定された文字列の長さを超えている場合,変数に設定されている文字列は取り出されません。

    ABC=abcdefghijklmn
    echo ${ABC:20}

    →変数ABCの文字列の長さが14文字しかないため,取り出せない

  • offsetまたはlengthに指定した変数名が未定義か,変数値が空の場合,offsetまたはlengthは0が指定されたものとして処理します。

  • offsetlengthに指定する変数の値をtypesetコマンドで属性変更した場合,変更方法によっては基数が変更(-Zオプションでゼロ詰めを指定すると8進数扱いとなる)されて,参照範囲が変わってしまう場合があります。また,基数変更で指定値が不正となることがあります。

    次の例では,typesetコマンドでの属性変更でゼロ詰めを指定することで,変数L1に指定した12が012となり,8進数と解釈されます。

    ABC=abcdefghijklmnopqrstuvwxyz
    typeset -Z3 D1=4
    typeset -Z3 L1=12
    echo ${ABC:D1:L1}

    →012(8進数)が10(10進数)と解釈され,efghijklmn(10文字)がSTDOUTに出力される

    また,次の例では,typesetコマンドでの属性変更でゼロ詰めを指定することで,変数D1に指定した8は008となり8進数と解釈されます。しかし,8進数では0〜7の数値しか指定できないため,エラーとなります。

    ABC=abcdefghijklmnopqrstuvwxyz
    typeset -Z3 D1=8
    typeset -Z3 L1=12
    echo ${ABC:D1:L1}

    →8進数に8が指定されていると解釈され,エラーとなる

    offsetlengthに指定する変数が,再帰的な参照指定または循環参照指定となっている場合はエラーとなります。例を次に示します。

    • 再帰的な参照指定の例

      ABC=abcdefghijklmnopqrstuvwxyz

      D1=D1

      echo ${ABC:D1}

    • 循環参照指定の例

      ABC=abcdefghijklmnopqrstuvwxyz

      D1=D2

      D2=D1

      echo ${ABC:D1}

offsetおよびlengthの実行例を次に示します。

  • offset(5)を指定

    ABC=abcdefghijklmn
    echo ${ABC:5}

    →「fghijklmn」が標準出力に出力される。

  • offset(5)を指定しlength(4)を指定

    ABC=abcdefghijklmn
    echo ${ABC:5:4}

    →「fghi」が標準出力に出力される。

  • offset(-1)を指定

    ABC=abcdefghijklmn
    echo ${ABC: -1}

    →「n」が標準出力に出力される。

  • offsetを定義した変数名を指定

    DEF=abcdefghijklmn
    CNT=5
    echo ${DEF:CNT}

    →「fghijklmn」が標準出力に出力される。

  • offsetlengthを定義した変数名を指定

    DEF=abcdefghijklmn
    CNT=5
    LEN=4
    echo ${DEF:CNT:LEN}

    →「fghi」が標準出力に出力される。

  • offsetを定義した変数名を指定

    DEF=abcdefghijklmn
    CNT=-1
    echo ${DEF:CNT}

    →「n」が標準出力に出力される。

  • 変数xyzを明示的に指定し,変数に指定した値の5文字目から3文字分までを参照する場合,変数xyzにマルチバイト文字が含まれている状態で,offsetlengthの値を変数CNTとLENに代入して参照

    xyz=あいうえおかきくけこさしすせabcdefghそたち
    CNT=4
    LEN=3
    echo ${xyz: CNT: LEN}

    →「おかき」が標準出力に出力される。

  • 変数xyzを明示的に指定し,変数に指定した値の-17文字目から14文字分までを参照する場合,変数xyzにマルチバイト文字が含まれている状態で,offsetlengthの値を変数CNTとLENに代入して参照

    xyz=あいうえおかきくけこさしすせabcdefghそたち
    CNT=-17
    LEN=14
    echo ${xyz: CNT: LEN}

    →「けこさしすせabcdefgh」が標準出力に出力される。

(4) 変数に設定できる書式,属性

JP1/Advanced Shellでは変数に対して書式および属性を設定できます。設定できる書式と属性を次の表に示します。

表5‒1 変数に対して設定できる書式

書式

意味

左詰め

変数に代入されている値を左詰めに変換します。

右詰め

変数に代入されている値を右詰めに変換します。

ゼロ詰め

変数に代入されている値を右詰めに変換します。さらに,値が数値の場合は,値の先頭までのスペースに0を挿入します。

小文字変換

変数に代入されている値のうち,大文字を小文字に変換します。

大文字変換

変数に代入されている値のうち,小文字を大文字に変換します。

表5‒2 変数に対して設定できる属性

属性

意味

整数型属性

変数に代入されている値を整数として扱います。

また,出力時の基数を定義できます。

読み込み専用属性

変数を読み込み専用とします。

エクスポート属性

変数をエクスポートします。

書式および属性はtypesetコマンドで設定します。typesetコマンドの詳細については,「typesetコマンド(変数や関数の属性と値を明示的に宣言する)」を参照してください。

変数に対して書式を設定した例を次に示します。この例では,次の変数が定義されている場合を仮定しています(△はスペース)。例の各行の右側には,定義内容に対する説明を記載しています。

  STRn="△AbCdeFgHiJk△"
  NUMn="12345"