Hitachi

JP1 Version 11 JP1/Advanced Shell 


5.1.3 配列

JP1/Advanced Shellでは変数の1つとして,配列を作成および参照できます。

要素番号0から65,535までの,最大65,536個の要素を保持する1次元配列を作成できます。また,2つの要素番号からなる配列で最大65,536×64 個の要素を保持できる2次元配列を作成できます。要素を1つも指定しなかった場合,配列は設定されません。

〈この項の構成〉

(1) 配列の作成

配列の作成方法を次に示します。

(2) 配列名=( …)による配列の作成

配列名=( …)」の形式で定義した1次元配列は,「set -A 配列名 …」の形式で登録されます。

配列名[]=({ … } { … } …)」の形式で定義した2次元配列は,「set -D 配列名 { … } { … }」の形式で登録されます。

JOBLOGには「配列名=(値 値 …)」および「配列名[]=({ … } { … } …)」の形式でなく,「setコマンド」が実行されたように出力されます。

配列を「配列名=( …)」の形式で作成した場合も,配列要素の管理方法はほかの配列と同じです。例えば,次の定義で作成した1次元配列は,「set -A ARRAY x1 x2 x3 x4 x5」で作成した配列と同じです。

ARRAY=(x1 x2 x3 x4 x5)と定義した場合の配列要素
ARRAY[0]=x1
ARRAY[1]=x2
ARRAY[2]=x3
ARRAY[3]=x4
ARRAY[4]=x5

n

要素

0

x1

1

x2

2

x3

3

x4

4

x5

注※

nは配列要素番号を示します。

2次元配列についても,配列を「配列名[]=({ … } { … } …)」の形式で作成した場合,配列要素の管理方法はset -Dコマンドで作成した配列と同じです。例えば,次の定義で作成した2次元配列は,「set -D ARRAY { x1 x2 x3 } { x4 x5 x6 }」で作成した配列と同じです。

ARRAY[]=({ x1 x2 x3 } { x4 x5 x6 })と定義した場合の配列要素
ARRAY[0][0]=x1
ARRAY[0][1]=x2
ARRAY[0][2]=x3
ARRAY[1][0]=x4
ARRAY[1][1]=x5
ARRAY[1][2]=x6

n※1

m※2

0

1

2

0

x1

x2

x3

1

x4

x5

x6

注※1

nは配列要素番号を示します。

注※2

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

したがって,JOBLOGへの出力,カバレージの採取,およびシェルオプションxtraceの出力は,setコマンドで配列定義をした場合と同じ出力結果になります。

なお,「配列名=()」と定義した場合は,名称が"配列名"で値が空文字列のシェル変数が作成されます。これは「配列名=」と定義した場合と同じです。

(a) 配列の生成例

次に示す変数を使用して,シェル変数を含む配列要素を生成する例を表に示します。

A=a
B=b
C=c
MA=' a b c' 
MB=d
注※

「'」はスペースの有無を明確にするために便宜的に記載しています。実際の変数値には含まれません。

表5‒3 配列要素の生成例

配列定義

生成される配列の内容

生成される配列の数

(a b c)

[0]=a [1]=b [2]=c

3

($A $B $C)

[0]=a [1]=b [2]=c

3

(${A}${B}${C})

[0]=a [1]=b [2]=c

3

($A $B `echo 1`)

[0]=a [1]=b [2]=1

3

($A$B $C)

[0]=ab [1]=c

2

(${A}xyz ${B}stu)

[0]=axyx [1]=bstu

2

($MA $MB)

[0]=a [1]=b [2]=c [3]=d

4

($MA$MB)

[0]=a [1]=b [1]=cd

3

(b) 配列を使用した場合のJOBLOGの出力例

配列の定義例と,それによるJOBLOGの出力例を示します。

  • 1次元配列SEQ1に配列数3の配列要素(x1 x2 x3)を設定する。

    SEQ1=(x1 x2 x3)
    echo ${SEQ1[@]}

    → "x1 x2 x3"が標準出力に出力されます。

    配列SEQ1を使用したJOBLOGの出力例を次に示します。

    KNAX7901-I ジョブコントローラは,ジョブ終了時にすべての非同期実行プロセスの完了を待ちます。
    KNAX0724-I ジョブ識別子を割り当てました。Jobid=046187
    ---------------------------------------------------------------
     Advanced Shell 11-00
    
     [ジョブ情報]
       ジョブ識別子                   : 046187
       スプールジョブディレクトリパス : /var/opt/jp1as/spool/046187/
       実行日付                       : 2015/10/29
       システム環境ファイルパス       : 
       ジョブ環境ファイルパス         : 
       ホスト名                       : host01
     [Automatic Job Management Systemから渡された環境変数]
    ---------------------------------------------------------------
    ********  ジョブコントローラのメッセージ出力  ********
    14:46:13 046187 KNAX0091-I ADSH046187 ジョブが開始しました。
    14:46:13 046187 KNAX7901-I ジョブコントローラは,ジョブ終了時にすべての非同期実行プロセスの完了を待ちます。
    14:46:13 046187 KNAX7902-I ジョブコントローラは,"端末入力モード"で動作します。
    14:46:13 046187 KNAX6112-I コマンド(set, 行番号=1)が正常終了しました。rc=0 E-Time=0.000s C-Time=0.000s
    14:46:13 046187 KNAX6112-I コマンド(echo, 行番号=2)が正常終了しました。rc=0 E-Time=0.000s C-Time=0.000s
    14:46:13 046187 KNAX0098-I ADSH046187 ジョブが終了しました。rc=0 E-Time=0.001s C-Time=0.010s
    
    ********   ジョブ定義スクリプトの内容    ********
    
    ***** /home/user001/SAMPLE_JOB6.ash *****
    0001 : SEQ1=(x1 x2 x3)
    0002 : echo ${SEQ1[@]}
    0003 : 
    
    ***** パス変換情報 *****
    
    ********   実行ジョブのSTDERRファイルの内容    ********
    KNAX0098-I ADSH046187 ジョブが終了しました。rc=0 E-Time=0.001s C-Time=0.010s
    
    ******** ジョブステップの出力 ********
    KNAX6380-I ルートジョブのスプールジョブディレクトリにジョブ名を付加します。spool job directory="/var/opt/jp1as/spool/046187-ADSH046187/"
    KNAX7999-I ルートジョブのジョブコントローラがバッチジョブを終了しました。rc=0
    
    ********   実行ジョブのSTDOUTファイルの内容    ********
    x1 x2 x3>
  • 2次元配列SEQ2に配列数3x2の配列要素({ x1 x2 x3 } { x4 x5 x6 })を設定する。

    SEQ2[]=({ x1 x2 x3 }{ x4 x5 x6 })
    echo ${SEQ2[@]}

    → "x1 x2 x3 x4 x5 x6"が標準出力に出力されます。

    配列SEQ2を使用したJOBLOGの出力例を次に示します。

    KNAX7901-I ジョブコントローラは,ジョブ終了時にすべての非同期実行プロセスの完了を待ちます。
    KNAX0724-I ジョブ識別子を割り当てました。Jobid=046189
    ---------------------------------------------------------------
     Advanced Shell 11-00
    
     [ジョブ情報]
       ジョブ識別子                   : 046189
       スプールジョブディレクトリパス : /var/opt/jp1as/spool/046189/
       実行日付                       : 2015/10/29
       システム環境ファイルパス       : 
       ジョブ環境ファイルパス         : 
       ホスト名                       : host01
     [Automatic Job Management Systemから渡された環境変数]
    ---------------------------------------------------------------
    ********  ジョブコントローラのメッセージ出力  ********
    15:01:31 046189 KNAX0091-I ADSH046189 ジョブが開始しました。
    15:01:31 046189 KNAX7901-I ジョブコントローラは,ジョブ終了時にすべての非同期実行プロセスの完了を待ちます。
    15:01:31 046189 KNAX7902-I ジョブコントローラは,"端末入力モード"で動作します。
    15:01:31 046189 KNAX6112-I コマンド(set, 行番号=1)が正常終了しました。rc=0 E-Time=0.000s C-Time=0.000s
    15:01:31 046189 KNAX6112-I コマンド(echo, 行番号=2)が正常終了しました。rc=0 E-Time=0.000s C-Time=0.000s
    15:01:31 046189 KNAX0098-I ADSH046189 ジョブが終了しました。rc=0 E-Time=0.001s C-Time=0.000s
    
    ********   ジョブ定義スクリプトの内容    ********
    
    ***** /home/user001/SAMPLE_JOB7.ash *****
    0001 : SEQ2[]=({ x1 x2 x3 } { x4 x5 x6 })
    0002 : echo ${SEQ2[@]}
    
    ***** パス変換情報 *****
    
    ********   実行ジョブのSTDERRファイルの内容    ********
    KNAX0098-I ADSH046189 ジョブが終了しました。rc=0 E-Time=0.001s C-Time=0.000s
    
    ******** ジョブステップの出力 ********
    KNAX6380-I ルートジョブのスプールジョブディレクトリにジョブ名を付加します。spool job directory="/var/opt/jp1as/spool/046189-ADSH046189/"
    KNAX7999-I ルートジョブのジョブコントローラがバッチジョブを終了しました。rc=0
    
    ********   実行ジョブのSTDOUTファイルの内容    ********
    x1 x2 x3 x4 x5 x6
  • 1次元配列SEQ1に,次のように配列要素を代入した変数名を定義し,配列数3の配列を設定する。

    ARR1=x1
    ARR2=x2
    ARR3=x3
    SEQ1=($ARR1 $ARR2 $ARR3)
    echo ${SEQ1[@]}

    → "x1 x2 x3"が標準出力に出力されます。

    配列SEQ1を使用したJOBLOGの出力例を次に示します。

    KNAX7901-I ジョブコントローラは,ジョブ終了時にすべての非同期実行プロセスの完了を待ちます。
    KNAX0724-I ジョブ識別子を割り当てました。Jobid=046191
    ---------------------------------------------------------------
     Advanced Shell 11-00
    
     [ジョブ情報]
       ジョブ識別子                   : 046191
       スプールジョブディレクトリパス : /var/opt/jp1as/spool/046191/
       実行日付                       : 2015/10/29
       システム環境ファイルパス       : 
       ジョブ環境ファイルパス         : 
       ホスト名                       : host01
     [Automatic Job Management Systemから渡された環境変数]
    ---------------------------------------------------------------
    ********  ジョブコントローラのメッセージ出力  ********
    15:10:08 046191 KNAX0091-I ADSH046191 ジョブが開始しました。
    15:10:08 046191 KNAX7901-I ジョブコントローラは,ジョブ終了時にすべての非同期実行プロセスの完了を待ちます。
    15:10:08 046191 KNAX7902-I ジョブコントローラは,"端末入力モード"で動作します。
    15:10:08 046191 KNAX6110-I コマンド(ARR1=x1, 行番号=1)が正常終了しました。rc=0 E-Time=0.000s C-Time=0.000s
    15:10:08 046191 KNAX6110-I コマンド(ARR2=x2, 行番号=2)が正常終了しました。rc=0 E-Time=0.000s C-Time=0.000s
    15:10:08 046191 KNAX6110-I コマンド(ARR3=x3, 行番号=3)が正常終了しました。rc=0 E-Time=0.000s C-Time=0.000s
    15:10:08 046191 KNAX6112-I コマンド(set, 行番号=4)が正常終了しました。rc=0 E-Time=0.000s C-Time=0.000s
    15:10:08 046191 KNAX6112-I コマンド(echo, 行番号=5)が正常終了しました。rc=0 E-Time=0.000s C-Time=0.000s
    15:10:08 046191 KNAX0098-I ADSH046191 ジョブが終了しました。rc=0 E-Time=0.002s C-Time=0.000s
    
    ********   ジョブ定義スクリプトの内容    ********
    
    ***** /home/user001/SAMPLE_JOB8.ash *****
    0001 : ARR1=x1
    0002 : ARR2=x2
    0003 : ARR3=x3
    0004 : SEQ1=($ARR1 $ARR2 $ARR3)
    0005 : echo ${SEQ1[@]}
    
    ***** パス変換情報 *****
    
    ********   実行ジョブのSTDERRファイルの内容    ********
    KNAX0098-I ADSH046191 ジョブが終了しました。rc=0 E-Time=0.002s C-Time=0.000s
    
    ******** ジョブステップの出力 ********
    KNAX6380-I ルートジョブのスプールジョブディレクトリにジョブ名を付加します。spool job directory="/var/opt/jp1as/spool/046191-ADSH046191/"
    KNAX7999-I ルートジョブのジョブコントローラがバッチジョブを終了しました。rc=0
    
    ********   実行ジョブのSTDOUTファイルの内容    ********
    x1 x2 x3
  • 2次元配列SEQ2に,次のように配列要素を代入した変数名を定義し,配列数3x2の配列を設定する。

    ARR1=x1
    ARR2=x2
    ARR3=x3
    ARR4=x4
    ARR5=x5
    ARR6=x6
    SEQ2[]=({ $ARR1 $ARR2 $ARR3 } { $ARR4 $ARR5 $ARR6 })
    echo ${SEQ2[@]}

    → "x1 x2 x3 x4 x5 x6"が標準出力に出力されます。

    配列SEQ2を使用したJOBLOGの出力例を次に示します。

    KNAX7901-I ジョブコントローラは,ジョブ終了時にすべての非同期実行プロセスの完了を待ちます。
    KNAX0724-I ジョブ識別子を割り当てました。Jobid=046193
    ---------------------------------------------------------------
     Advanced Shell 11-00
    
     [ジョブ情報]
       ジョブ識別子                   : 046193
       スプールジョブディレクトリパス : /var/opt/jp1as/spool/046193/
       実行日付                       : 2015/10/29
       システム環境ファイルパス       : 
       ジョブ環境ファイルパス         : 
       ホスト名                       : host01
     [Automatic Job Management Systemから渡された環境変数]
    ---------------------------------------------------------------
    ********  ジョブコントローラのメッセージ出力  ********
    15:17:35 046193 KNAX0091-I ADSH046193 ジョブが開始しました。
    15:17:35 046193 KNAX7901-I ジョブコントローラは,ジョブ終了時にすべての非同期実行プロセスの完了を待ちます。
    15:17:35 046193 KNAX7902-I ジョブコントローラは,"端末入力モード"で動作します。
    15:17:35 046193 KNAX6110-I コマンド(ARR1=x1, 行番号=1)が正常終了しました。rc=0 E-Time=0.000s C-Time=0.000s
    15:17:35 046193 KNAX6110-I コマンド(ARR2=x2, 行番号=2)が正常終了しました。rc=0 E-Time=0.000s C-Time=0.000s
    15:17:35 046193 KNAX6110-I コマンド(ARR3=x3, 行番号=3)が正常終了しました。rc=0 E-Time=0.000s C-Time=0.000s
    15:17:35 046193 KNAX6110-I コマンド(ARR4=x4, 行番号=4)が正常終了しました。rc=0 E-Time=0.000s C-Time=0.000s
    15:17:35 046193 KNAX6110-I コマンド(ARR5=x5, 行番号=5)が正常終了しました。rc=0 E-Time=0.000s C-Time=0.000s
    15:17:35 046193 KNAX6110-I コマンド(ARR6=x6, 行番号=6)が正常終了しました。rc=0 E-Time=0.000s C-Time=0.000s
    15:17:35 046193 KNAX6112-I コマンド(set, 行番号=7)が正常終了しました。rc=0 E-Time=0.000s C-Time=0.000s
    15:17:35 046193 KNAX6112-I コマンド(echo, 行番号=8)が正常終了しました。rc=0 E-Time=0.000s C-Time=0.000s
    15:17:35 046193 KNAX0098-I ADSH046193 ジョブが終了しました。rc=0 E-Time=0.003s C-Time=0.000s
    
    ********   ジョブ定義スクリプトの内容    ********
    
    ***** /home/user001/SAMPLE_JOB9.ash *****
    0001 : ARR1=x1
    0002 : ARR2=x2
    0003 : ARR3=x3
    0004 : ARR4=x4
    0005 : ARR5=x5
    0006 : ARR6=x6
    0007 : SEQ2[]=({ $ARR1 $ARR2 $ARR3 } { $ARR4 $ARR5 $ARR6 })
    0008 : echo ${SEQ2[@]}
    
    ***** パス変換情報 *****
    
    ********   実行ジョブのSTDERRファイルの内容    ********
    KNAX0098-I ADSH046193 ジョブが終了しました。rc=0 E-Time=0.003s C-Time=0.000s
    
    ******** ジョブステップの出力 ********
    KNAX6380-I ルートジョブのスプールジョブディレクトリにジョブ名を付加します。spool job directory="/var/opt/jp1as/spool/046193-ADSH046193/"
    KNAX7999-I ルートジョブのジョブコントローラがバッチジョブを終了しました。rc=0
    
    ********   実行ジョブのSTDOUTファイルの内容    ********
    x1 x2 x3 x4 x5 x6
    

(c) 注意事項

1行に記述できるバイト数は8,192バイトまでです。そのため,配列要素番号を拡張した配列を定義した場合,最大配列数を1行のコマンドラインにすべて記述するとエラーになります。8,192バイトを超える場合は,継続行指定('\')で1行に指定できるバイト数に区切ってください。

継続行指定('\')を使った定義例を次に示します。

<setコマンドでの定義例>
set -A ARRAY x0\
 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 … x1000 \
x1001 x1002 x1003 x1004 x1005 x1006 x1007 x1008 x1009 x1010 x1011 … x2000 \
   :
x65001 x65002 x65003 x65004 x65005 x65006 x65007 x65008 x65009 … x65535
<代入式での定義例>
ARRAY=( x0\
 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 … x1000 \
x1001 x1002 x1003 x1004 x1005 x1006 x1007 x1008 x1009 x1010 x1011 … x2000 \
   :
x65001 x65002 x65003 x65004 x65005 x65006 x65007 x65008 x65009 … x65535)

(3) 配列の値の参照

配列の値の参照方法を次に示します。

配列の値の参照例を次に示します。

ジョブ定義スクリプトの内容
set -A myArray a01 a02 a03     #myArrayを配列として定義する。
for myElement in ${myArray[*]} #myArrayの全要素をfor文のwordlistsに展開する。
do
  echo $myElement
done
標準出力への出力結果
a01
a02
a03

(4) 大量の配列要素を確保する場合のメモリ所要量について

2次元配列では,最大65,536×64個の配列要素の生成ができます。

しかし,2次元配列の生成を実行するプロセスに与えられている使用可能なメモリ量によっては,最大配列要素数を確保できない場合があります。

2次元配列の生成に必要なメモリ量の見積もり式は次のとおりです。

(324+x) × y
x:平均配列要素データ長(8の倍数単位に切り上げて指定)
y:生成する最大配列要素数(1〜65,536×64)

上記のメモリ所要量と,他の構文などで使用するメモリ所要量との合計が,プロセスで使用可能なメモリ量を超えていないかを確認してください。