Bashの配列変数
添え字が数値の一般的な配列(indexed array)と添え字に文字列を使用する連想配列(associative array)の二種類がある。 配列(indexed array)と連想配列(associative array)の違いは、 添え字が数値か文字列かの違いと、値や添え字を列挙した際に添え字の数値順になるかどうかの違い。
配列(indexed array)の添え字は0始まりで、添え字が連続しない疎な配列を作成できる。
初期化、宣言と代入
配列(indexed array)
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"]
連想配列(associative array)
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
添え字が連続していない疎な配列(indexed array)
配列の添え字が連続していない場合、添え字が数値になった連想配列のような動きになる。
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