5.1.2 変数
変数とはジョブ定義スクリプト内で値を代入する領域のことです。変数の作成および変数の値を参照できます。また,変数は,エクスポートによって子プロセスに環境変数として引き継がせることができます。変数のことをシェル変数ともいいます。
(1) 変数の命名規則
作成する変数の名称は,命名規則の範囲で任意に指定できます。また,英字は大文字と小文字を区別するため,同じスペルであっても異なる変数名になります。
ただし,Windows環境で小文字が含まれる変数をエクスポートし,環境変数として使用しようとすると,VAR_ENV_NAME_LOWERCASEパラメーターの指定によってはエラーとなります。
変数の命名規則を次に示します。環境変数の命名規則については「(a) 環境変数の命名規則【Windows限定】」を参照してください。
-
使用できる文字は英数字と_(アンダースコア)だけです。
-
先頭文字は数字以外にしてください。
-
変数名の長さは無制限です。ただし,入力行の上限およびCUIデバッガのコマンド入力文字数の上限が存在します。そのため,ジョブ定義スクリプト内で使用する変数の長さは上限以下であることを推奨します。
入力行の上限については,「5.1 ジョブ定義スクリプトを構成する基本要素」を参照してください。CUIデバッガのコマンド入力文字数の上限については,「6.1.4 デバッガのコマンド一覧【UNIX限定】」を参照してください。
(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コマンド |
シェル変数名に小文字を指定できる。 |
同左 |
for シェル変数 |
シェル変数名に小文字を指定できる。 |
同左 |
awkコマンドのENVIRON組み込み変数 |
添え字に環境変数名を指定できるが,小文字も指定できる。 |
同左 |
adshjavaコマンドのバッチアプリケーションに渡す引数 |
システムプロパティで環境変数名を指定できるが,adshjavaコマンドは文字種別をチェックしない。 |
同左 |
稼働実績情報取得機能で採取する環境変数 |
環境変数名と値を採取するが,環境変数名の文字種別をチェックしない。 |
同左 |
(2) 変数の作成と値の代入
変数を作成,および値を代入する場合の書式を次に示します。
変数名=値
変数は=の左項に変数名を記述することで作成されます。作成された変数には,値の書き込みおよび値の読み込みができます。変数に値を代入する場合は,=の右項に値を記述します。変数は次の点に注意して作成してください。
-
変数の属性が読み込み専用の場合,変数への値の代入はエラー終了し,ジョブは終了します。変数の属性を読み込み専用に変更する場合は,シェル標準コマンドのreadonlyコマンドを使用します。
readonlyコマンドについては,「9.3 シェル標準コマンド」の「readonlyコマンド(変数の属性を読み込み専用に変更する,または読み込み専用の変数を表示する)」を参照してください。
-
変数名に未作成の変数を指定した場合は,変数の作成と同時に値が代入されます。変数に代入する値が文字列の場合,何文字でも代入できます。
しかし,typesetコマンドで整数型に定義した変数に数値を代入する場合や,変数に代入した数値を使用して算術演算する場合は,変数の値および算術結果が-2147483648〜2147483647の範囲内でなければなりません。範囲外の値を指定した場合,正しい結果を求めることができません。
-
=の両脇にはスペースを入力しないでください。スペースが入っていた場合,変数は作成されません。
-
変数にスペースやメタキャラクタを含む文字列を代入する場合は,クォーテーション('または")で囲んでメタキャラクタを無効化にするか,エスケープ文字を使用してください。メタキャラクタおよびメタキャラクタの無効化については,「5.1.6 メタキャラクタ」を参照してください。
(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」を指定します。
offsetやlengthには変数名の命名規則に示されている文字および数値以外は指定できません。offsetやlengthに指定する変数名および数値は,次の規則に従い記述してください。
指定値 |
指定規則 |
---|---|
数値(符号なし)の場合 |
指定値の前後にはスペース,タブは指定できません。 |
数値(符号あり)の場合 |
符号の直前にはスペースを指定する必要があります。それ以外の指定値の前後にはスペース,タブは指定できません。 |
変数の場合 |
指定値の前後にはスペース,タブは指定できません。 |
offsetの指定省略の場合 |
スペースの指定はできますが,タブの指定はできません。 |
複数行にわたって記述する場合,行の終端に\を付けて改行できます。
offsetとlengthに指定できる数値の範囲を次に示します。
種類 |
指定範囲(単位:文字)※ |
指定例 |
---|---|---|
offset |
-65535〜65535 |
0を指定した場合,文字列の先頭から出力されます。 正の値を指定した場合,文字列の先頭+1番目を起点として出力されます。 負の値を指定した場合,文字列の終端から数えた位置が起点となります。
|
length |
0〜65536 |
|
- 注※
-
数値は次のどちらかの方法で指定できます。
-
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が指定されたものとして処理します。
-
offsetやlengthに指定する変数の値を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が指定されていると解釈され,エラーとなる
offsetやlengthに指定する変数が,再帰的な参照指定または循環参照指定となっている場合はエラーとなります。例を次に示します。
-
再帰的な参照指定の例
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」が標準出力に出力される。
-
offsetとlengthを定義した変数名を指定
DEF=abcdefghijklmn CNT=5 LEN=4 echo ${DEF:CNT:LEN}
→「fghi」が標準出力に出力される。
-
offsetを定義した変数名を指定
DEF=abcdefghijklmn CNT=-1 echo ${DEF:CNT}
→「n」が標準出力に出力される。
-
変数xyzを明示的に指定し,変数に指定した値の5文字目から3文字分までを参照する場合,変数xyzにマルチバイト文字が含まれている状態で,offsetとlengthの値を変数CNTとLENに代入して参照
xyz=あいうえおかきくけこさしすせabcdefghそたち CNT=4 LEN=3 echo ${xyz: CNT: LEN}
→「おかき」が標準出力に出力される。
-
変数xyzを明示的に指定し,変数に指定した値の-17文字目から14文字分までを参照する場合,変数xyzにマルチバイト文字が含まれている状態で,offsetとlengthの値を変数CNTとLENに代入して参照
xyz=あいうえおかきくけこさしすせabcdefghそたち CNT=-17 LEN=14 echo ${xyz: CNT: LEN}
→「けこさしすせabcdefgh」が標準出力に出力される。
(4) 変数に設定できる書式,属性
JP1/Advanced Shellでは変数に対して書式および属性を設定できます。設定できる書式と属性を次の表に示します。
書式 |
意味 |
---|---|
左詰め |
変数に代入されている値を左詰めに変換します。 |
右詰め |
変数に代入されている値を右詰めに変換します。 |
ゼロ詰め |
変数に代入されている値を右詰めに変換します。さらに,値が数値の場合は,値の先頭までのスペースに0を挿入します。 |
小文字変換 |
変数に代入されている値のうち,大文字を小文字に変換します。 |
大文字変換 |
変数に代入されている値のうち,小文字を大文字に変換します。 |
属性 |
意味 |
---|---|
整数型属性 |
変数に代入されている値を整数として扱います。 また,出力時の基数を定義できます。 |
読み込み専用属性 |
変数を読み込み専用とします。 |
エクスポート属性 |
変数をエクスポートします。 |
書式および属性はtypesetコマンドで設定します。typesetコマンドの詳細については,「typesetコマンド(変数や関数の属性と値を明示的に宣言する)」を参照してください。
変数に対して書式を設定した例を次に示します。この例では,次の変数が定義されている場合を仮定しています(△はスペース)。例の各行の右側には,定義内容に対する説明を記載しています。
STRn="△AbCdeFgHiJk△" NUMn="12345"
-
ジョブ定義スクリプトの内容
typeset -L STR1 # STR1を左詰め書式に変更 echo $STR1 # STR1を出力 typeset -L5 STR2 # STR2を領域長5バイト,左詰め書式に変更 echo $STR2 # STR2を出力 typeset -R STR3 # STR3を右詰め書式に変更 echo $STR3 # STR3を出力 typeset -R4 NUM1 # NUM1を領域長4バイト,右詰め書式に変更 echo $NUM1 # NUM1を出力 typeset -Z9 STR4 # STR4を領域長9バイト,ゼロ詰め書式に変更 echo $STR4 # STR4を出力 typeset -Z9 NUM2 # NUM2を領域長9バイト,ゼロ詰め書式に変更 echo $NUM2 # NUM2を出力 typeset -l STR5 # STR5を小文字変換書式に変更 echo $STR5 # STR5を出力 typeset -u STR6 # STR6を大文字変換書式に変更 echo $STR6 # STR6を出力 typeset -i16 NUM3 # NUM3を16進数表記の整数型属性に変更 echo $NUM3 # NUM3を出力
-
実行したジョブのSTDOUTファイルの内容
******** JOB SCOPE STDOUT ******** AbCdeFgHiJk ← STR1の出力結果 AbCde ← STR2の出力結果 AbCdeFgHiJk ← STR3の出力結果 2345 ← NUM1の出力結果 CdeFgHiJk ← STR4の出力結果 000012345 ← NUM2の出力結果 abcdefghijk ← STR5の出力結果 ABCDEFGHIJK ← STR6の出力結果 16#3039 ← NUM3の出力結果