Help us understand the problem. What is going on with this article?

bash 配列まとめ

More than 5 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"

以上です。

mercari
フリマアプリ「メルカリ」を、グローバルで開発しています。
https://tech.mercari.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away