5.1.3 配列
JP1/Advanced Shellでは変数の1つとして,配列を作成および参照できます。
要素番号0から65,535までの,最大65,536個の要素を保持する1次元配列を作成できます。要素を一つも指定しなかった場合,配列は設定されません。
- 〈この項の構成〉
(1) 配列の作成
配列の作成方法を次に示します。
-
複数の要素を一度に作成する場合(setコマンドを使用する方法)
set -A 配列名 値 値 … set +A 配列名 値 値 …
使用例
set -A abc 1 2 3 echo ${abc[1]}
→2が標準出力に出力されます。
この方法では複数の要素を一度に作成できます。set -Aコマンドについては,「9.3 シェル標準コマンド」の「setコマンド(シェルオプションを設定する,配列を作成する,または変数の値を表示する)」を参照してください。
-
1つの要素を作成する場合
配列名[要素番号]=値
使用例
abc[0]=1 abc[1]=2 abc[2]=3 echo ${abc[1]}
→2が標準出力に出力されます。
この方法では要素を1つずつ作成します。複数の要素を作成する場合は,作成する要素分実行してください。また,要素番号0の配列は,変数と同じになります。
-
複数の要素を一度に作成する場合(setコマンドを使用しない方法)
配列名=(値 値 …)
使用例
abc=(1 2 3) echo ${abc[1]}
→2が標準出力に出力されます。
この方法では複数の要素を一度に作成できます。作成方法の詳細については,「(2) 配列名=(値 値 …)による配列の作成」を参照してください。
(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) 配列の値の参照
配列の値の参照方法を次に示します。
-
配列の1要素の値を参照する場合
${配列名[要素番号]}
使用例
set -A abc 1 2 3 echo ${abc[1]}
→2が標準出力に出力されます。
-
配列の全要素の値を参照する場合
配列の全要素の値を参照するには,次の4種類の方法があります。
参照方法1
${配列名[*]}
使用例
set -A abc 1 2 3 echo ${abc[*]}
→1 2 3が標準出力に出力されます。
参照方法2
${配列名[@]}
使用例
set -A abc 1 2 3 echo ${abc[@]}
→1 2 3が標準出力に出力されます。
参照方法3
"${配列名[*]}"
注 参照方法3の場合,IFSシェル変数の値で区切られます。
使用例
set -A abc 1 2 3 IFS=: echo "${abc[*]}"
→1:2:3が標準出力に出力されます。
参照方法4
"${配列名[@]}"
使用例
set -A abc 1 2 3 echo "${abc[@]}"
→1 2 3が標準出力に出力されます。
配列の値の参照例を次に示します。
- ジョブ定義スクリプトの内容
set -A myArray a01 a02 a03 #myArrayを配列として定義する。 for myElement in ${myArray[*]} #myArrayの全要素をfor文のwordlistsに展開する。 do echo $myElement done
- 標準出力への出力結果
a01 a02 a03