Bash 配列のガイド

公開: 2022-12-30

Bash 配列に関するこのガイドでは、Bash でインデックス付き配列と連想配列を宣言して操作する方法を学習します。

Bash では、配列を作成して要素のコレクションを格納できます。 Bash 配列は1 次元のコレクションです。 C や C++ などのプログラミング言語では、配列は同じデータ型の要素のコレクションです。 ただし、Bash では、ユース ケースによっては、整数と文字列を同じ配列に格納できます。

このチュートリアルでは、Bash 配列を宣言し、その要素にアクセスする方法を学習します。 次に、配列の要素をループ処理して要素を配列に追加する方法を学習します。 最後に、Bash の連想配列について学びます。

さぁ、始めよう!

一緒にコーディングすることに興味がありますか? 前提条件は次のとおりです。

  • Mac または Linux マシンを使用している場合は、ターミナルを開いて一緒にコードを作成できます。
  • Windows マシンを使用している場合は、Git Bash または Windows Subsystem for Linux (WSL2) をインストールしてください。

Bash 配列を宣言する方法

このセクションでは、Bash 配列を宣言するための構文とコード例を学習します。

Bash 配列宣言の構文

次の構文を使用して、Bash で配列を宣言できます。

 $ arrayName=(elt1 elt2 ... eltN) # arrayName is the name of the array # elt1 through eltN are the N elements in the array

上記の構文で、 arrayNameNの要素elt1...eltNを含む配列の名前を示します。

配列の要素は、左括弧 () と右括弧()で囲まれます。 また、配列の要素が空白で区切られていることに注意してください。 他の Bash 変数と同様に、代入演算子=の前後に空白があってはなりません

他のほとんどのプログラミング言語では、配列または同様のコレクションの要素をコンマで区切ります。 しかし、Bash では、空白が区切り文字です。

Bash では、要素がインデックスによって識別されるような配列は、 indexed arrayと呼ばれます。

Bash でのインデックス付き配列の宣言

数値の配列であるpricesを作成しましょう。

 $ prices=(24 27 18 30 15)

構文で説明されているように、 prices配列内の数値は空白で区切られ、括弧で囲まれ、= 代入演算子の前後にスペースはありません。

Bash では、 echoコマンドを使用して変数の値を出力できます。 $variableNameを使用すると、 variableNameの値が出力されます。 ただし、配列の名前を使用すると、最初の要素のみが出力されることがわかります。

 $ echo $prices 24

Bash 配列はゼロ インデックスに従います。 したがって、最初の要素はインデックス 0 にあり、2 番目の要素はインデックス 1 にあり、以下同様です。 負のインデックスを使用することもできます。 最後の配列要素のインデックスは -1 です。

特定のインデックスで要素にアクセスして出力しようとするとどうなりますか? インデックス 1 の要素を出力してみましょう。

 $ echo $prices[1] 24[1]

出力が 24[1] なのはなぜですか? これは、Bash が$pricesを配列の最初の要素である 24 に置き換え、[1] がそのように出力されるためです。

特定のインデックスで要素を出力するには、 ${prices[index]}形式のパラメーター展開を使用できます。

 $ echo ${prices[1]} # 27 $ echo ${prices[2]} # 18

配列内のすべての要素を出力するには、特定のインデックスの代わりに@を指定できます。

 $ echo ${prices[@]} 24 27 18 30 15

次に、文字列の配列を作成しましょう。 次のコマンドを実行すると、インデックス付き配列が作成されます。

 $ declare -a fruits

オプション-aは、インデックス付き配列を作成します。 以下に示すように、特定のインデックスで要素を宣言することにより、一度に 1 つの要素を配列に入力できるようになりました。

 $ fruits[0]="cherry" $ fruits[1]="berry" $ fruits[2]="apple" $ fruits[3]="pear" $ fruits[4]="melon" $ fruits[5]="orange"

ここで、配列のすべての要素を出力するには、 ${fruits[@]}を使用できます。

 $ echo ${fruits[@]} cherry berry apple pear melon orange

Bash 配列の要素へのアクセス

bash-array-access-elements

配列の要素には、次の方法でアクセスできます。

  • 配列をループして要素に直接アクセスする
  • 一連のインデックスをループし、特定のインデックスの要素にアクセスします

配列をループして要素にアクセスする

Python でコーディングした場合は、次の構文を使用して for ループを使用したことになります。

 for elt in some_list: print(elt)

では、上記の for ループに相当する Bash を書きましょう。

{prices[@]}は、 prices配列のすべての要素に展開されることがわかっています。 ${prices[@]}は、すべての要素の値を示します。

Bash の for ループは Python の for ループ構文に似ていますが、ループ本体のステートメントはdodoneで囲む必要があります。

 $ for price in ${prices[@]} > do > echo $price > done

echo コマンドを使用して変数priceの値を出力するため、次の出力が得られます。

 # output 24 27 18 30 15

配列インデックスを使用して要素にアクセスする

配列をループする別の方法は、要素のインデックスを使用することです。 これは、Python の for ループ コンストラクトがrange()関数を使用していることに似ています。

 for i in range(len(some_list)): print(i)

ループするインデックスのリストを取得するには、パラメーター展開で配列名の前に感嘆符 ( ! ) を配置します。 これにより、次のように、配列のすべての有効なインデックスのリストが表示されます。

 $ echo ${!prices[@]} 0 1 2 3 4

prices配列には 5 つの要素が含まれているため、インデックスは 0 から始まり、4 まで増加します。

次に、インデックスのリストをループして、各インデックスの要素にアクセスできます。 インデックスiの場合、 ${prices[i]}はインデックスiの要素です。

 $ for i in ${!prices[@]} > do > echo ${prices[i]} > done

上記のループは、配列内のすべての要素を出力します。

 # output 24 27 18 30 15

ここでは、各要素にアクセスした後、その値を出力するという簡単な操作を実行します。 一般に、要素に対して有効な処理を行うことができます。

要素を Bash 配列に追加する

Bash Array へのガイド

prices配列には、5 つの要素があります (インデックス 0、1、2、3、および 4)。 配列の末尾のインデックス 5 に要素を追加する場合は、次のようにします。

 $ prices[5]=21

価格配列の末尾に 21 が追加されていることがわかります。

 $ echo ${prices[@]} 24 27 18 30 15 21

ただし、最後に追加された要素のインデックスまたは現在配列内にある要素の数を記憶せずに、配列の末尾に追加する方が便利です。

次のように、 arrayName+=(elements(s)) it を使用して、1 つ以上の要素を配列に追加できます。

 $ prices+=(10)

ここで、 prices配列を出力すると、配列の末尾に 10 が追加されていることがわかります。

 $ echo ${prices[@]} 24 27 18 30 15 21 10

次に、Bash で連想配列を宣言する方法を学びましょう。

Bash の連想配列

キーと値のペアで関係を定義する場合は、連想配列を使用できます。 次の一般的な構文を使用して、連想配列を宣言できます。 -aの代わりに-Aオプションを使用していることに注意してください。

 $ declare -A fruits_prices

キーと対応する値を指定することで、連想配列に要素を追加できます。 ここでは、果物の名前をキーとして追加し、価格配列の数字を値として追加しました。

 $ fruits_prices[cherry]=24 $ fruits_prices[berry]=27 $ fruits_prices[apple]=18 $ fruits_prices[pear]=30 $ fruits_prices[melon]=15 $ fruits_prices[orange]=21

では、連想配列の要素にアクセスするにはどうすればよいでしょうか。

Python 辞書で対応するキーを使用して値を検索するのと同じように、キーを使用して連想配列の値にアクセスできます。

 $ echo ${fruits_prices[berry]} # 27

${fruits_prices[@]}が値に展開され、 ${!fruits_prices[@]}がキーに展開されることがわかります。

 $ echo ${fruits_prices[@]} # Output: 18 27 21 24 30 15 $ echo ${!fruits_prices[@]} # Output: apple berry orange cherry pear melon

: 要素の順序は、要素を追加した順序と同じではありません。 これは、インデックス付き配列とは異なり、連想配列は順序付けられたコレクションではないためです。 むしろ、キーと値の間の関連付けに取り組みます。 したがって、連想配列に対するキーは、インデックス付き配列に対するインデックスと同じです。

次のように、連想配列をループしてキーにアクセスすることもできます。

 $ for key in ${!fruits_prices[@]} > do > echo $key > done
 # Output apple berry orange cherry pear melon

次のループは、値にアクセスする方法を示しています。

 $ for value in ${fruits_prices[@]} > do > echo $value > done
 # Output 18 27 21 24 30 15

arrayName[key]=valueを使用することをお勧めしますが、次のようにシーケンスとして宣言することもできます。

 declare -A arrayName arrayName=(key1 value1 key2 value2 ... keyN valueN)

このようにして、Bash は最初の要素を最初のキーとして、2 番目の要素を最初の値として、というように推論します。

まとめ

Bash 配列を作成して操作する方法を理解していただければ幸いです。 ここでは、学んだことの簡単な復習を行います。

  • 構文arrayName=(elt1 elt2 elt3 ... eltN)を使用して Bash でインデックス付き配列を宣言するか、 declare -a arrayNameを実行して配列に要素を追加できます。
  • 要素にアクセスするには、 ${arrayName[@]}を使用してループできます。 または、パラメーター展開${!arrayName[@]}を使用して、すべての有効なインデックスのリストを取得できます。
  • 最後に、連想配列を宣言してキーと値のペアを Bash に格納する方法も学びました。

次に、Bash でのループのチュートリアルを確認してください。