Edited at

bash 配列まとめ

More than 3 years have passed since last update.

Linux ディストリビューションなどで標準搭載されている bash ですが、基本的にデフォルトで使えるデータ構造は配列くらいです。そこで、その扱いについてまとめました。


■ 配列を生成する

たとえば、空の配列を生成するには以下のようにします。

array=()

また、ビルトインコマンドの declare(関数スコープでの定義は local)で生成することも可能です。

declare -a array=()               # 宣言

declare -a array=("a" "b" "c") # 初期化

some_func() {
local local_array=() # 関数内スコープは local で定義できる ...
}


■ 配列の要素数

echo ${#array[@]}              # 3

echo ${#array[*]} # 3

配列の要素数をチェックする場合は、[@] でも [*] でも差異はないようです。


■ 配列のデータを操作する


● データを追加する

# 先頭に追加

array=(3 "${array[@]}") # array は (3 “a” "b" "c")

# 末尾に追加
array=("${array[@]}" 4) # array は (3 "a" "b" "c" 4)
array+=( 5 ) # array は (3 "a" "b" "c" 4 5)

末尾に追加する書き方は二通りですが、どちらでも同じようです。しかし、前者のほうが「先頭に追加」の表記方法と整合性が取れるので、可読性を高めそうです。


● 配列からデータを取り出す

# データの先頭要素を取り出す(破壊的操作)

array=("${array[@]:1}") # array は ("a" "b" "c" 4 5)

# データの末尾要素取り出す(破壊的操作)
declare -i num=${#array[@]}-1
array=("${array[@]:0:$num}") # array は ("a" "b" "c" 4)
# 一行でも書けます
array=(${array[@]:0:((${#array[@]}-1))}) # array は ("a" "b" "c")


● 配列のデータを参照する

i=0

for e in ${array[@]}; do
echo "array[$i] = ${e}"
let i++
done

array[0] = a

array[1] = b

array[2] = c

# C言語風に記述する

for ((i = 0; i < ${#array[@]}; i++)) {
echo "array[$i] = ${array[i]}"
}

array[0] = a

array[1] = b

array[2] = c

# Bash 独自の記述 1

echo "${array[@]}"

a b c

# Bash 独自の記述 2

IFS=$'\n'
echo "${array[*]}"

a

b

c


● 配列のデータから任意の要素を削除する

# ある要素を削除

unset array[1]
echo "${array[@]}" # arrayは("a" "c")

echo ${array[0]} # array[0]は"a"
echo ${array[1]} # array[1]は ""(空)
echo ${array[2]} # array[2]は"c"

配列の中身のデータは削除できても、配列自体は削除できません。


添字を詰めたければ、

array=("${array[@]}"

代入しなおす必要があります。

unset array[@]                 # 全削除する

echo "${array[@]}" # 配列 array は ""(空)
echo "${#array[@]}" # 要素数は0


● 配列にデータを格納する

array[0]=1

array[1]="a"

以上です。