ウェブサイト検索

例を用いたBashインデックス配列の解説


配列は、特定の型の値を格納するために使用されるデータ構造の一種です。配列を変数として考えることもできますが、変数は1つの値しか格納できないのに対し、配列は複数の値を格納することができます。配列の概念はbashに限ったものではありません。どのプログラミング言語でも配列が存在しますが、実装には違いがあります。

Bashは2種類の配列をサポートしています:

  • インデックス配列
  • 連想配列

インデックス配列は、要素(値)が0からNまでの整数で保存および割り当てられる配列の一種です。配列の中の要素はインデックス番号を使って参照されます。これについては次回の記事でさらに詳しく学ぶことができます。本記事の主な焦点はインデックス配列にのみあります。

Bashでインデックス付き配列を初期化する方法

配列を操作する最初のステップは、それを作成することです。用語配列を作成する、定義する、初期化するは互換的に使用されますが、意味は同じであり、配列を作成することを指します。

配列を作成するには、角かっこを使用し、配列の要素(値)を角かっこの中に置く必要があります。

$ arr1=( one 2 three 4 )

注意すべき重要な点:

  • Bashの配列は異なるデータ型の要素を格納することができます。いくつかのプログラミング言語では、同じ型の値のみを配列に格納することができます。
  • 配列に格納できる要素の数に制限はありません。それはシステムのメモリの利用可能性に依存します。

また、declare コマンドを -a フラグ付きで使用して、インデックス配列を作成することもできます。

$ declare -a arr1
$ arr1=( one 2 three 4 )

または、

$ declare -a arr1=( one 2 three 4 )

配列の要素を追加または表示する方法

前のセクションで示したように値が入った配列を作成することもできますし、単に空の配列を作成して後で値を追加することもできます。以下は空の配列を作成する方法です。

$ locations=()

配列内の各要素には、0からNまでの関連付けられたインデックス値があります。インデックスの位置を使って配列に新しい要素を追加する必要があります。

$ locations[0]="Chennai"
$ locations[1]="Mumbai"

これは配列に要素を追加するグラフィカルな図解です。

図解 - 配列に要素を追加する

配列の要素を表示するには、次のいずれかの構文を使用できます。

$ echo ${locations[@]}
$ echo ${locations[*]}

配列を初期化して印刷する

@ と * の違いとそれが配列でどのように機能するかを知るには、私たちの Bash の For ループ ガイドの「配列の要素をループ処理する」セクションを参照してください。

もし配列の要素を @ や * を使わずに列挙しようとすると、配列の最初の要素だけが表示されます。

$ echo ${locations}

*や@の演算子なしの配列

特定の要素には、そのインデックス位置を使って直接アクセスできます。

$ echo ${locations[1]}

特定のインデックス位置で配列を出力する

配列のインデックス値

前のセクションでは、インデックス位置を使用して配列に要素を追加する方法を示しました。インデックス位置を使用して配列に要素を追加する場合、異なるインデックス位置に要素をスキップして追加することができます。

配列の場所には、0 と 1 の位置に2つの要素があります。これでインデックス2をスキップして、異なるインデックスの位置に追加できます。

$ locations[5]="Delhi"

新しい要素を追加

上の画像から、配列のインデックス位置5に新しい要素を追加したのが分かります。

図示表現 - 配列に新しい要素を追加する

要素のインデックス値を表示したい場合は、以下のように配列の前に"!"記号を付けます。

$ echo ${!locations[@]}

これは要素を出力する代わりに、インデックスの値だけを出力します。

インデックス位置を印刷する

インデックスと要素の両方を出力するには、次のスニペットを使用してください。

for val in ${!locations[@]}
do
   echo "index = ${val} , value = ${locations[$val]}"
done

インデックスと要素を印刷する

配列に値を追加する

配列にインデックス値を使わずに新しい要素を追加することができ、これにより要素は配列の末尾に追加されます。

locations=( Chennai Mumbai Delhi )
locations+=( Bangalore )
locations+=( Hyderabad )
$ echo ${locations[@]}
$ echo ${!locations[@]}

配列に要素を追加する

配列の長さを求める

配列の前に # 記号を付けることで、その配列にいくつの要素があるかを取得できます。

$ echo ${#locations[@]}

配列の長さ

同じ#記号を使って、配列が空かどうかも確認できます。

if [[ ${#locations[@]} -ne 0 ]]; then
    echo "Array is Not empty"
else
    echo "Array is Empty"
fi

配列が空かどうかを確認する

配列から要素を削除する

配列から要素を削除するには、unset コマンドを使用できます。以下の例では、unset コマンドを使用して index(2) の要素が削除されています。

$ echo ${locations[@]}
$ unset locations[2]
$ echo ${locations[@]}

配列から要素を削除する

配列を削除する

配列を削除するには、同じ unset コマンドを使用できます。

$ unset locations
$ echo ${locations[@]}

配列を削除

配列を空にする

時々、配列のすべての要素を削除して配列を空のままにしたい場合があります。その場合は、単に配列を再作成すればよいです。

$ echo ${locations[@]}
Chennai Mumbai Delhi Hyderabad Bangalore
$ locations=()
$ echo ${locations[@]}

配列を空にする

コマンドの出力を配列として保存する

任意のコマンドを実行して、その出力を配列に保存することができます。出力を配列として保存するには、コマンドをブラケットで囲む必要があります。

$ path_list=( $(echo $PATH | tr ":" "\n") )
$ echo ${path_list[@]}

コマンドの出力を配列として保存する

配列のスライス

スライスを使うと、配列のインデックス位置に基づいて特定の要素を取り出す柔軟性が得られます。

以下はスライスの構文です:

${locations[@]:index:length}

特定の開始インデックス位置からすべての要素を取得したい場合は、インデックスだけを使って次のように行うことができます。

$ echo ${locations[@]:index} # syntax
$ echo ${locations[@]:2}

スライス - インデックス位置

上の例では、配列はインデックス位置2から最後の要素まで印刷されます。インデックスと一緒に長さを指定すると、次の式を使用して配列をスライスします。

From index to index+length-1 (inclusive) # Formula
$ echo ${locations[@]:1:3}

スライス - インデックスと長さ

もしインデックスを省略して長さだけを指定すると、次の式を使ってスライスされます。

From Index 0 to length-1 (inclusive)
$ echo ${locations[@]::4}

スライス - 長さだけ

結論

この記事では、bashのインデックス付き配列について説明しました。複雑なbashスクリプトを書き始めると、配列は非常に重要です。配列を使うことで、さまざまな型のデータを簡単に保存、取得、操作する能力が得られます。Pythonのようなプログラミング言語とは異なり、配列を使って複雑なタスクを簡単に実行するための組み込みの方法はありませんが、それでも達成可能です。

次のガイドでは、連想配列について詳しく説明します。

  • Bashスクリプト – 連想配列を例で解説

関連記事:

  • Bashスクリプト – WhileループとUntilループの例を用いた解説
  • Bashスクリプト – 関数の説明と例
  • Bashスクリプト – 変数の説明と例
  • 事例で解説するBashのリダイレクション
  • LinuxにおけるBashのEchoコマンドの説明と例
  • 初心者のためのBashヒアドキュメントチュートリアル