【Shell】配列:要素の追加・削除・インデックスの取得

■配列とは

配列とは要素を並べて格納し、番号で参照できるデータ構造である。
この時、各要素に割り振られた番号をインデックスと言う。
なお、基本的にインデックスは「0」始まりである。

▼配列(変数名:array)のイメージ図

■配列に値を設定し、全ての値を表示・1つずつ表示・要素数を表示

配列に値を設定し、全表示・要素を1つずつ表示・格納されている要素数を表示する。

▼サンプルコード

# 配列をセット
array1=(a b c d e)

# 配列の中身を全て表示
echo '#####配列の中身を全て表示#####'
echo ${array1[*]}

# 配列の中身を1つずつ表示(配列のインデックスは0始まり)
echo '#####配列の中身を1つずつ表示#####'
echo ${array1[0]}
echo ${array1[1]}
echo ${array1[2]}
echo ${array1[3]}
echo ${array1[4]}

# 配列の要素数を表示
echo '#####配列の要素数を表示#####'
echo ${#array1[@]}

▼実行結果

#####配列の中身を全て表示#####
a b c d e
#####配列の中身を1つずつ表示#####
a
b
c
d
e
#####配列の要素数を表示#####
5

■要素の追加・削除

空の配列を作成し、要素の追加・削除、値が設定されているインデックスの表示を行う。

▼サンプルコード(空の配列セットから要素の追加)

# 空の配列をセット
array2=()

# 配列に要素の追加(一部インデックスを指定して格納)
array2=(a b [3]=d [5]=f g)

# 配列の中身を全て表示
echo '#####配列の中身を全て表示#####'
echo ${array2[@]}

# 配列の中身を1つずつ表示(配列のインデックスは0始まり)
echo '#####配列の中身を1つずつ表示#####'
echo ${array2[0]}
echo ${array2[1]}
echo ${array2[2]}
echo ${array2[3]}
echo ${array2[4]}
echo ${array2[5]}
echo ${array2[6]}

▼実行結果

#####配列の中身を全て表示#####
a b d f g
#####配列の中身を1つずつ表示#####
a
b

d

f
g

配列(array2)は、一部インデックスを指定して、要素を格納している。
この場合、要素を格納していない、インデックス[2]・[4]については、空文字となる。
なお、要素「g」については、インデックスを指定せず、格納しているが、途中のインデックス[2]・[4]には格納されず、末端のインデックス[6]に格納される。

★イメージ図(一部インデックスを指定して要素を格納)

▼サンプルコード(要素削除&配列の値が存在するインデックスを表示)

# 配列の削除(bを消す)
unset array2[1]

# 配列の中身を全て表示
echo '#####配列の中身を全て表示#####'
echo ${array2[@]}

# 配列の中身を1つずつ表示(配列のインデックスは0始まり)
echo '#####配列の中身を1つずつ表示#####'
echo ${array2[0]}
echo ${array2[1]}
echo ${array2[2]}
echo ${array2[3]}
echo ${array2[4]}
echo ${array2[5]}
echo ${array2[6]}

# インデックスを表示
echo '#####配列の値が存在するインデックスを表示#####'
echo ${!array2[@]}

▼実行結果

#####配列の中身を全て表示#####
a d f g
#####配列の中身を1つずつ表示#####
a


d

f
g
#####配列の値が存在するインデックスを表示#####
0 3 5 6

配列(array2)のインデックス[1]の値を削除(unset)することで、インデックス[1]の値は空文字となる。

★イメージ図(インデックス[1]の値を削除)

したがって、配列の値が存在するインデックス[0]・[3]・[5]・[6]となる。

■2つの配列を結合し、1つの配列を作成する(「*」使用の場合)

2つの配列(array3・array4)を「*」使用して配列(array5)に一つの配列として格納する。

▼サンプルコード

# 要素の追加(配列→配列)
array3=(a b)
array4=(c d e)
array5=("${array3[*]}" "${array4[*]}" f g)
echo '#####配列の中身を全て表示#####'
echo 'array3 : '${array3[*]}
echo 'array4 : '${array4[*]}
echo 'array5 : '${array5[*]}

▼実行結果

#####配列の中身を全て表示#####
array3 : a b
array4 : c d e
array5 : a b c d e f g

表示上では、配列(array5)には7つの要素が格納されているように見受けられるが、
実際は、配列(array5)のインデックス[0]に配列(array3)、インデックス[1]に配列(array4)が格納されていることに注意!!
「*」で取得した場合、要素は一つの要素array3:”a b”)として出力される

★イメージ図

したがって、配列(array5)のインデックス[1]の値を「x」に変更すると表示結果は以下の通りとなる。

# 配列の要素を変更
array5[1]=x
echo 'array5 : '${array5[*]}
array5 : a b x f g

■2つの配列を結合し、1つの配列を作成する(「@」使用の場合)

2つの配列(array3・array4)を「@」使用して配列(array5)に一つの配列として格納する。

▼サンプルコード

# 要素の追加(配列→配列)
array3=(a b)
array4=(c d e)
array5=("${array3[@]}" "${array4[@]}" f g)
echo '#####配列の中身を全て表示#####'
echo 'array3 : '${array3[@]}
echo 'array4 : '${array4[@]}
echo 'array5 : '${array5[@]}
echo '#####配列の要素数を表示#####'
echo ${#array5[@]}

▼実行結果

#####配列の中身を全て表示#####
array3 : a b
array4 : c d e
array5 : a b c d e f g
echo '#####配列の要素数を表示#####'
#####配列の要素数を表示#####
7

配列(array5)には配列(array:a b)、配列(array4:c d e)および「 f 」「 g 」の要素7つの要素が格納されている。
「@」で取得した場合、要素は別々の要素(array3:”a” “b”)として出力される

★イメージ図

したがって、配列(array5)のインデックス[1]の値を「x」に変更すると表示結果は以下の通りとなる。

# 配列の要素を変更
array5[1]=x
echo 'array5 : '${array5[*]}
array5 : a x c d e f g

タイトルとURLをコピーしました