articles:bash_array

Bashの配列変数

添え字が数値の一般的な配列(indexed array)と添え字に文字列を使用する連想配列(associative array)の二種類がある。 配列(indexed array)と連想配列(associative array)の違いは、 添え字が数値か文字列かの違いと、値や添え字を列挙した際に添え字の数値順になるかどうかの違い。

配列(indexed array)の添え字は0始まりで、添え字が連続しない疎な配列を作成できる。

declare -a idx_arr # 配列(indexed array)の宣言
# -> []
idx_arr=(value1 value2) # 代入
# -> ["value1", "value2"]
declare -p idx_arr
# -> declare -a idx_arr=([0]="value1" [1]="value2")
idx_arr=() # 空の配列を代入
# -> []
idx_arr=([0]=value3 [1]=value4) # 添え字形式で配列へ代入
# -> ["value3 ", "value4"]
declare -A assoc_arr # 連想配列(associative array)の宣言
# -> {}
assoc_arr=(key1 value1 key2 value2) # 連想配列への代入
# -> {"key1": "value1", "key2": "value2"}
declare -p assoc_arr
# -> declare -A assoc_arr=([key2]="value2" [key1]="value1" )
assoc_arr=([key3]=value3 [key4]=value4) # 添え字形式で連想配列へ代入
# -> {"key3": "value3", "key4": "value4"}

宣言と代入は同時に記述可能。また、宣言は省略可能。代入する値は複数行にまたがって記述可能。

declare -a array1=(value1 value2) # 宣言と代入を同時に記述
# -> ["value1", "value2"]
declare -p assoc_arr
# -> declare -A assoc_arr=([key2]="value2" [key1]="value1" )
array2=(value1, value2) # 宣言無しで代入
# -> ["value1", "value2"]
array1=( # 複数行にまたがって代入する値を記述
value1
"value  2" # 空白を含む要素
value3 value4
)
# -> ["value1", "value  2", "value3", "value4"]

ブラケット[]の中に添え字を記述して、全体を{}で括ると値を参照できる。${array[0]}。 ブラケットなしだと最初の要素を参照。

array=(value1 "value  2")
 
echo ${array[0]}
# -> value1
echo ${array[1]}
# -> value 2
echo "${array[1]}"
# -> "value  2"
 
echo $array
# -> value1
echo $array[1]
# -> value1[1]

配列の一部を切り出すことも可能。空白文字があるなら二重引用符で括る。

array=(value1 "value  2" value3)
# -> ["value1", "value  2", "value3"]
echo "${array[@]:1}"
# -> value  2 value3
echo "${array[@]:0:2}"
# -> value1 value  2
 
echo "${array[@]: -2:1}"
# -> value  2
echo "${array[@]: -2:2}"
# -> value  2 value3

添え字に@または*を指定して、変数名の前に#、全体を{}で括る。${#array[@]}

idx_arr=(value1 value2)
echo ${#idx_arr[@]}
# -> 2
echo ${#idx_arr[*]} # @と*どちらでも可
# -> 2
assoc_arr=(key1 value1 key2 value2)
echo ${#assoc_arr[@]}
# -> 2

配列の添え字に*または@を指定すると配列の値を列挙する。 二重引用符で括ると*@の違いが出る。

空白文字がある場合を考慮して、一般的には二重引用符で括り添え字に@を使用する。“${array[@]}”

idx_arr=(value1 "value  2" value3)
declare -p idx_arr
# -> declare -a idx_arr=([0]="value1" [1]="value  2" [2]="value3")
 
echo ${idx_arr[*]}
# = echo value1 value  2 value3
# -> value1 value 2 value3
 
for e in ${idx_arr[*]}; do echo $e; done
# -> value1
# -> value
# -> 2
# -> value3
 
echo ${idx_arr[@]}
# = echo value1 value  2 value3
# -> value1 value 2 value3
 
for e in ${idx_arr[@]}; do echo $e; done
# -> value1
# -> value
# -> 2
# -> value3
 
echo "${idx_arr[*]}"
# = echo "value1 value  2 value3"
# -> value1 value  2 value3
 
for e in "${idx_arr[*]}"; do echo $e; done
# = echo value1 value  2 value3
# -> value1 value 2 value3
 
for e in "${idx_arr[*]}"; do echo "$e"; done
# = echo "value1 value  2 value3"
# -> value1 value  2 value3
 
echo "${idx_arr[@]}"
# = echo "value1" "value  2" "value3"
# -> value1 value  2 value3
 
for e in "${idx_arr[@]}"; do echo $e; done
# = echo value1 -> value1
# = echo value  2 -> value 2
# = echo value3 -> value3
 
for e in "${idx_arr[@]}"; do echo "$e"; done
# = echo "value1" -> value1
# = echo "value  2" -> value  2
# = echo "value3" -> value3
assoc_arr=(key1 "value  1" "key  2" value2)
declare -p assoc_arr
# declare -A assoc_arr=([key1]="value  1" ["key  2"]="value2" )
 
echo "${assoc_arr[@]}"
= echo "value  1" "value2"
-> value  1 value2

値の列挙と同じ考え方。変数名の前に!を付ける。 添え字に空白文字がある場合を考慮して、一般的には二重引用符で括り添え字に@を使用する。“${!array[@]}”

idx_arr=(value1 "value  2" value3)
 
echo ${!idx_arr[@]}
# -> 0 1 2
assoc_arr=(key1 "value  1" "key  2" value2)
 
echo ${!assoc_arr[*]}
# -> key1 key 2
 
echo ${!assoc_arr[@]}
# -> key1 key 2
 
echo "${!assoc_arr[*]}"
# echo "key1 key  2"
# -> key1 key  2
 
echo "${!assoc_arr[@]}"
# echo "key1" "key  2"
# -> key1 key  2
 
for e in "${!assoc_arr[@]}"; do echo $e; done
# = echo key1 -> key1
# = echo key  2 -> key 2
 
for e in "${!assoc_arr[@]}"; do echo "$e"; done
# = echo "key1" -> key1
# = echo "key  2" -> key  2
for e in "${array[@]}"
do
  echo "$e"
done
for i in "${!array[@]}"
do
  echo "[$i] = ${array[$i]}"
done

+=で配列の後ろに別の配列を追加できる。

array=(value1 value2)
# -> ["value1", "value2"]
array+=(value3 value4)
# -> ["value1", "value2", "value3", "value4"]
 
array=(value1 value2)
# -> ["value1", "value2"]
array2=("value 3" value4)
# -> ["value 3", "value4"]
array+=("${array2[@]}") # 別の配列変数を追加する
# -> ["value1", "value2", "value 3", "value4"]
array=(value1 value2)
# -> ["value1", "value2"]
array[1]=new2
# -> ["value1", "new2"]
array[${#array[@]}]=value3
# -> ["value1", "new2", "value3"]
array[4]=value5
# -> {0: "value1", 1: "new2", 2: "value3", 4: "value5"}
declare -p array
# -> declare -a array=([0]="value1" [1]="new2" [2]="value3" [4]="value5")

unsetを使用する。

array=(value1 value2 value3)
declare -p array
# -> declare -a array=([0]="value1" [1]="value2" [2]="value3")
unset array[1]
declare -p array
# -> declare -a array=([0]="value1" [2]="value3")
unset array
declare -p array
# -> bash: declare: array: not found

配列の添え字が連続していない場合、添え字が数値になった連想配列のような動きになる。

iarray=([0]=elem5 [2]=elem6) # 非連続の添え字を指定して代入
# -> {0: "elem5", 2: "elem6"}
declare -p iarray
# -> declare -a iarray=([0]="elem5" [2]="elem6")
echo ${#iarray[@]} # 配列の長さ
# -> 2
echo ${iarray[@]} # 値の列挙
# -> elem5 elem6
echo ${!iarray[@]} # 添え字の列挙
# -> 0 2
test -z ${iarray[1]}; echo $? # 代入していない要素の値は空文字列と同じ扱い
# -> 0
test -v iarray[1]; echo $? # 代入していない要素は未定義扱い
# -> 1
test -z ${iarray[0]}; echo $? # 代入している要素の値は空文字列と判定されない
# -> 1
test -v iarray[0]; echo $? # 代入している要素は定義済み扱い
# -> 0
  • 最終更新: 2025-02-22 15:48
  • by nabium