More than 1 year has 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"

以上です。