Bash 配列のガイド
公開: 2022-12-30Bash 配列に関するこのガイドでは、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
上記の構文で、 arrayName
はN
の要素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 配列の要素へのアクセス
配列の要素には、次の方法でアクセスできます。
- 配列をループして要素に直接アクセスする
- 一連のインデックスをループし、特定のインデックスの要素にアクセスします
配列をループして要素にアクセスする
Python でコーディングした場合は、次の構文を使用して for ループを使用したことになります。
for elt in some_list: print(elt)
では、上記の for ループに相当する Bash を書きましょう。
{prices[@]}
は、 prices
配列のすべての要素に展開されることがわかっています。 ${prices[@]}
は、すべての要素の値を示します。
Bash の for ループは Python の for ループ構文に似ていますが、ループ本体のステートメントはdo
とdone
で囲む必要があります。
$ 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 配列に追加する
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 でのループのチュートリアルを確認してください。