1. ホーム
  2. スクリプト・コラム
  3. リナックスシェル

シェルアレイへの要素追加と注意点

2022-02-08 09:14:22

Shell配列に要素を追加する方法はいくつかありますが、それぞれの方法には使用する際に注意すべき点があります。

添え字の直接付加

array_name[index]=value


配列要素を追加する最も簡単な方法は、添え字のインデックスを使用して値を割り当てることです。ただし、添え字のインデックスに値がないことを確認する必要があり、そうでない場合はインデックスの元の値を置き換えることになります。

配列の長さを追加する

array_name[${#array_name[@]}]=value
# or array_name[${#array_name[*]}]=value


配列の長さを添え字として追加する場合、一度にひとつの要素しか追加できません。ただし、この方法は、配列の要素の添え字が連続していることが前提条件となり、そうでない場合は既存の要素を置き換えてしまう危険性があります。たとえば、次のようになります。

arr=([1]="a" [2]="b")
echo ${arr[@]}
arr[${#arr[@]}]="c"
echo ${arr[@]}


要素を追加する代わりに、2の添え字の値 "b" を "c" に置き換えています。

配列を再作成する

array_name=("${array_name[@]}" value1 ... valueN)


 この方法は、添え字の連続性が必要なく、複数の要素を同時に追加することができますが、いくつかの注意点があります。

まず、この方法で要素を追加すると、配列内の元の要素の添え字がリセットされ、0から連続するようになります。添え字を変更したくない場合は、この方法を使用することはできません。

次に、ダブルクォートを省略できないと、配列array_nameの中にスペースを含む要素がある場合に、スペースで複数の要素に分割されてしまいます。

最後に、配列の要素を出力する際には相互に置き換えることができますが、"@" を "*" に置き換えることはできず、ダブルクォートを付けずに "*" に置き換えると "@" と同じ動作をし、ダブルクォートを付けた場合は配列配列_名のすべての要素を1要素として配列に追加されます。特殊変数$@と$*の違いに似ています。

#! /bin/bash
arr1=()
initArray(){
  arr1=([2]="a b" [3]=2 [5]=4)
}
showArray(){
  echo "Elements in arr1: ${arr1[@]}"
  echo "Length of arr1: ${#arr1[@]}"
  echo "The 3rd elements is: ${arr1[2]}"
  echo
}
initArray
echo "original arr1:"
showArray
echo "add new elements 3 and 5"
echo "--------------------"
echo "use @ without quote"
arr1=(${arr1[@]} 3 5)
showArray
initArray
echo "use * without quote"
arr1=(${arr1[*]} 3 5)
showArray
initArray
echo "use @ with quote"
arr1=("${arr1[@]}" 3 5)
showArray
initArray
echo "use * with quote"
arr1=("${arr1[*]}" 3 5)
showArray

実行結果は

オリジナルのarr1です。
arr1 の要素: a b 2 4
arr1 の長さ: 3
3 番目の要素は次のとおりです: a b
新規要素3、5を追加
--------------------
引用符なしで@を使用
arr1 の要素: a b 2 4 3 5
arr1の長さ:6
3番目の要素は2です。
引用符なしで*を使用
arr1 の要素: a b 2 4 3 5
arr1の長さ:6
3番目の要素は2です。
を引用して使用する
arr1 の要素: a b 2 4 3 5
arr1 の長さ: 5
3番目の要素は 4
を引用してください。
arr1 の要素: a b 2 4 3 5
arr1 の長さ: 3
3番目の要素は 5

代入演算子 +=

array_name+=(value1 ... valueN)

 この方法は、連続した添え字を必要とせず、複数の要素を追加することができ、追加後に要素の添え字をリセットせず、要素の上書きの危険もない。唯一の注意点は、"+="の前後にスペースを入れてはいけないことと、追加する要素を"()"で囲み、複数の要素をスペースで区切らなければいけないことです。新しく追加される要素の添え字は、元の配列で値を持つ最後の要素の添え字に依存します。

#! /bin/bash
arr1=()
initArray(){
  arr1=([2]="a b" [3]=2 [5]=4)
}
showArray(){
  echo "Elements in arr1: ${arr1[@]}"
  echo "Length of arr1: ${#arr1[@]}"
  echo "The 3rd elements is: ${arr1[2]}"
  echo
}
initArray
echo "original arr1:"
showArray
echo "add new elements 3 and 5"
echo "--------------------"
echo "use += "
arr1+=(3 5)
showArray
echo "The 8th elements is: ${arr1[7]}"


実行した結果は

元のarr1です。
arr1 の要素: a b 2 4
arr1 の長さ: 3
3 番目の要素は次のとおりです: a b
新規要素3、5を追加
--------------------
使用 +=
arr1 の要素: a b 2 4 3 5
arr1 の長さ: 5
3 番目の要素は次のとおりです: a b
8番目のエレメントは 5

配列の元の要素は変更されず、新しく追加された要素の添え字は、最後の要素の添え字の値が5だけ増分されます。

要約

<テーブル 追加方法 シンタックス

複数の要素を追加することができます

添え字は連続でなければならない 追加後に添え字が変更される 元の要素を上書きする可能性がある 添え字の直接付加 配列名[インデックス]=値 いいえ いいえ いいえ はい 追加された配列の長さ

配列名[${#array_name[@]}]=value

または array_name[${#array_name[*]}]=value

いいえ はい いいえ はい 配列を再作成する array_name=("${array_name[@]}"値1 ... 値N) は いいえ はい いいえ 代入演算子 += 配列名+=(値1 ... 値N) は はい はい いいえ

シェル配列に要素を追加する方法と注意点についての説明は以上です。Shellの配列に要素を追加する方法については、スクリプトハウスの過去記事を検索するか、以下の関連記事を引き続き閲覧してください。