Hitachi

JP1 Version 10 JP1/Advanced Shell


5.1.3 配列

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

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

〈この項の構成〉

(1) 配列の作成

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

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

配列名=( …)」の形式で定義した配列は,「set -A 配列名 …」の形式で登録されます。JOBLOGには「配列名=(値 値 …)」の形式でなく,「setコマンド」が実行されたように出力されます。

配列を「配列名=( …)」の形式で作成した場合も,配列要素の管理方法はほかの配列と同じです。例えば,次の定義で作成した配列は,「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

したがって,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の出力例を示します。

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

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

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

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

    KNAX7901-I adshexec waits for all asynchronous processes at the end of the job.
    KNAX0724-I Jobid was assigned. Jobid=000001
    ---------------------------------------------------------------
     JP1/Advanced Shell 10-50
     
     [Information]
       Jobid           : 000001
       Spool Directory : /var/opt/jp1as/spool/000001/
       Date            : 2014/06/20
       Config-system   : /opt/jp1as/conf/adshrc.ase
       Config-job      : /home/jp1asuser1/conf/adsh.conf
       HostName        : vm002149
     [JP1 Parameter]
    ---------------------------------------------------------------
    ********  JP1/Advanced Shell MESSAGE  ********
    14:38:44 000001 KNAX0091-I ADSH000001 Job started.
    14:38:44 000001 KNAX7901-I adshexec waits for all asynchronous processes at the end of the job.
    14:38:44 000001 KNAX7902-I adshexec will run in tty stdin mode.
    14:38:44 000001 KNAX6112-I Command set(line=1) succeeded. rc=0 E-Time=0.000s C-Time=0.000s
    14:38:44 000001 KNAX6112-I Command echo(line=2) succeeded. rc=0 E-Time=0.000s C-Time=0.000s
    14:38:44 000001 KNAX0098-I ADSH000001 Job ended. rc=0 E-Time=0.001s C-Time=0.000s
     
    ********   Script IMAGE    ********
     
    ***** /home/jp1asuser1/shell/A.sh *****
    0001 : SEQ1=(x1 x2 x3)
    0002 : echo ${SEQ1[@]}
    0003 :
     
    ***** CONVERSION INFORMATION *****
     
    ********   JOB SCOPE STDERR    ********
    KNAX0098-I ADSH000001 Job ended. rc=0 E-Time=0.001s C-Time=0.000s
     
    ******** JOBSTEP OUTPUT ********
    KNAX6380-I Job name will be added to spool job directory. spool job directory="/var/opt/jp1as/spool/000001-ADSH000001/"
    KNAX7999-I JP1/Advanced Shell ended. rc=0
     
    ********   JOB SCOPE STDOUT    ********
    x1 x2 x3
  • 配列SEQ1に,次のように配列要素を代入した変数名を定義し,配列数3の配列を設定する。

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

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

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

    KNAX7901-I adshexec waits for all asynchronous processes at the end of the job.
    KNAX0724-I Jobid was assigned. Jobid=000002
    ---------------------------------------------------------------
     JP1/Advanced Shell 10-50
     
     [Information]
       Jobid           : 000002
       Spool Directory : /var/opt/jp1as/spool/000002/
       Date            : 2014/06/20
       Config-system   : /opt/jp1as/conf/adshrc.ase
       Config-job      : /home/jp1asuser1/conf/adsh.conf
       HostName        : vm002149
     [JP1 Parameter]
    ---------------------------------------------------------------
    ********  JP1/Advanced Shell MESSAGE  ********
    14:39:33 000002 KNAX0091-I ADSH000002 Job started.
    14:39:33 000002 KNAX7901-I adshexec waits for all asynchronous processes at the end of the job.
    14:39:33 000002 KNAX7902-I adshexec will run in tty stdin mode.
    14:39:33 000002 KNAX6110-I Command ARR1=x1(line=1) succeeded. rc=0 E-Time=0.000s C-Time=0.000s
    14:39:33 000002 KNAX6110-I Command ARR2=x2(line=2) succeeded. rc=0 E-Time=0.000s C-Time=0.000s
    14:39:33 000002 KNAX6110-I Command ARR3=x3(line=3) succeeded. rc=0 E-Time=0.000s C-Time=0.000s
    14:39:33 000002 KNAX6112-I Command set(line=4) succeeded. rc=0 E-Time=0.000s C-Time=0.000s
    14:39:33 000002 KNAX6112-I Command echo(line=5) succeeded. rc=0 E-Time=0.000s C-Time=0.000s
    14:39:33 000002 KNAX0098-I ADSH000002 Job ended. rc=0 E-Time=0.001s C-Time=0.000s
     
    ********   Script IMAGE    ********
     
    ***** /home/jp1asuser1/shell/B.sh *****
    0001 : ARR1=x1
    0002 : ARR2=x2
    0003 : ARR3=x3
    0004 : SEQ1=(${ARR1} ${ARR2} ${ARR3})
    0005 : echo ${SEQ1[@]}
     
    ***** CONVERSION INFORMATION *****
     
    ********   JOB SCOPE STDERR    ********
    KNAX0098-I ADSH000002 Job ended. rc=0 E-Time=0.001s C-Time=0.000s
     
    ******** JOBSTEP OUTPUT ********
    KNAX6380-I Job name will be added to spool job directory. spool job directory="/var/opt/jp1as/spool/000002-ADSH000002/"
    KNAX7999-I JP1/Advanced Shell ended. rc=0
     
    ********   JOB SCOPE STDOUT    ********
    x1 x2 x3

(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