Bash辞書は、Linuxシェルスクリプトでハッシュマップと連想配列を与えます。独自のLinuxシェルスクリプトでこれらの強力で便利なデータ構造を使用する方法を説明します。
他の名前によるバラ
辞書の正式な名前は連想配列です。彼らはハッシュテーブルとハッシュマップとも呼ばれます。それらは通常の配列と同様に機能するデータ構造ですが、大きな違いがあります。
配列は、1つのデータ構造に保持されているデータ値の集まりです。配列要素として知られているデータ値のいずれかにアクセスするには、配列内のそれらの位置を知る必要があります。アレイ内の配列要素の位置はそのインデックスとして知られているので、これらの種類の配列はインデックス付きアレイとして知られています。それらは最も一般的に使用されているタイプのアレイです。
しかし、彼らは欠点を持っています。リスト内の位置がわからない場合は、配列要素にどのようにアクセスしますか? Array内のすべての要素を実行し、その場所の値が探しているものかどうかを確認するためにテストします。
連想配列はその問題を克服します。それらは、アレイ要素を一意に識別するために整数を使用しません。彼らはキーワードとして知られているユニークな単語を使います。配列内に配置されている場所に関係なく、そのキーワードを使用して配列要素の値を取得できます。インデックス付き配列では、配列内の位置を表す整数番号は昇順です。連想配列のキーワードは任意の順序であり得る。
キーワードで検索して、連想配列で値を調べることができます。単語を見上げて、それに関連する価値を検索し、辞書の単語を見上げてその意味を見つけることを模倣しています。それが連想配列が辞書として知られている理由です。
Bash 4.0以上
連想配列は内蔵されています バッシュシェル バージョン4.0以上。現在のLinuxディストリビューションを使用している場合は、大丈夫です。 Bashバージョンを確認するには、次のコマンドを使用します。
Bash - Version
この記事の調査に使用される機械は、Bash 5.1.4が設置されているので、私たちは行ってもいいです。
基本原則
ターミナルコマンドラインまたはスクリプト内に連想配列を作成するには、bash declareコマンドを使用します。 NS
-NS
(連想)オプションこれは、インデックス付き配列ではなく連想配列になるようにBashを指示します。
辞書を宣言する
これにより、「頭字語」という連想配列が作成されます。
いくつかのデータをアレイに入れるには、キーワードと値を提供する必要があります。このフォーマットを使用してこれを行うことができます。
配列名[key] = value
いくつかの配列要素を追加しましょう。
頭字語[ACK] =承認
頭字語[BGP] =「ボーダーゲートウェイプロトコル」
頭字語[CIDR] =「クラスレス間ドメインルーティング」
頭字語[DHCP] =「動的ホスト構成プロトコル」
頭字語[EOF] =「フレームの終わり」
これらのコマンドは5つの配列要素を定義します。値にスペースがある場合、値は引用符で囲まれていることに注意してください。私たちのキーワードはアルファベット順に入力されましたが、好きな順序で入力できます。キーワードは一意でなければなりません。同じキーワードを持つ2つのエントリを作成しようとすると、入力した2番目の値が最初に上書きされます。それでも、そのキーワードを持つエントリは1つだけです。追加した2番目の値に関連付けられます。
配列から値を取得するには、この形式でコマンドを使用します。
$ {array-name [key]}
エコーを使用して出力を端末ウィンドウに送信できます。
エコー$ {頭字語[ACK]}
エコー$ {頭字語[DHCP]}
ループを使う
配列はループで使用されていることを貸しています。連想配列は例外ではありません。ループは、コードの繰り返しセクションなしで一連のアクションを呼び出すための効率的な方法を提供します。ループを見る前に、アレイを宣言する効率的な方法があります。
これを使って配列を作成します
宣言する
コマンド(同じ
-NS
以前のオプション)、しかし、キーワードと値をコマンドラインのリストとして提供します。
宣言-A国=([Alb] =アルバニア[BHR] =バーレーン[CMR] =カメルーン[DNK] =デンマーク[エイジー] =エジプト)
配列名は「国」です。そして、それは値リストに等号で接続されています。
=
。」値リストは括弧内に折り返されます。
()
「そして各キーワードは括弧内に包まれています」
[
"。値を区切るコンマはないことに注意してください。スペースを含む値の文字列がある場合は、引用符で囲む必要があります。
連想配列を値ではなくキーワードを返すには、感嘆符を追加します。
!
"アレイ名の前で。 atシンボル」
@
「ワイルドカードとして使用することができます。つまり、すべての配列要素を意味します。
この
にとって
ループはすべてのキーワードをリストします。
キーワードは、必ずしも作成された順序でリストされていないが、それは問題ではありません。連想配列は注文されたインデックスに依存しません。
パラメータ展開を使用してすべてのキーワードをリストすることもできます。 1行に1行ずつリストされます。
エコー「$ {!国[@]}」
エコー "$ {!頭字語[@]}"
私達は私達のものを増強することができます
にとって
ループキーワードと値を同時に印刷します。
「$ {!頭字語[@]} "の鍵のための; echo "$ key - $ {acranyms [$ key]]}";
配列内にある要素がいくつあるか知りたい場合は、感嘆符の代わりにアレイ名の前にハッシュ "#"を使用できます。
エコー「$ {!国[@]}」
エコー "$ {!頭字語[@]}"
配列要素が存在することを確認します
キーワードを検索するが、そのような配列要素がない場合、戻り値は空の文字列になります。アレイ要素の有無に異なるインジケータを持つことは時にはそれが役立ちます。
これを使用して配列要素の存在を確認できます。
+ _
「オペレータ。これはキーワードの後に、前の演算子のように配列名の前に含まれていません。
[$ {頭字語[EOF] + _}]の場合それからエコー「見つかった」。それ以外の場合は「見つかりません」。 Fi
[$ {頭字語[FTP] + _}]の場合それからエコー「見つかった」。それ以外の場合は「見つかりません」。 Fi
キーワード「eof」を持つ配列要素が配列にありますが、キーワード "ftp"を持つ配列要素はそうではありません。
配列要素を追加する
連想配列に新しい要素を追加するのは簡単です。プログラミング言語とは異なり、それを宣言するときに配列のサイズを定義する必要はありません。あなたは事前定義された上限を打たずに新しい要素を追加し続けることができます。
配列に新しい要素を追加するには、「」を使用します。
+ =
「オペレータ。
国+ =([Fji] =フィジー)
エコー "$(#国[@]}"
エコー$ {国[Fji]}
配列内の要素数は6つになり、新しいキーワードを検索すると、配列要素が見つけられ、その値を返します。
配列要素と配列の削除
NS
未遂の
コマンドは配列要素を削除するために使用されます。キーワードにスペースがある場合は、それを引用符で囲みます。
未設定の頭字語[EOF]
[$ {頭字語[EOF] + _}]の場合それからエコー「見つかった」。それ以外の場合は「見つかりません」。 Fi
配列全体を削除するには、使用します
未遂の
配列の名前を付けて。
未払国
配列で変数を使用する
連想配列を持つ変数を使用することは簡単です。この例では、文字列 "eof"に変数キーを設定します。新しい配列要素を配列に追加すると、変数を使用します。実際には、以前に削除した配列要素を置き換えています。
新しいキーワードを使用して、および変数を使用して、新しいアレイ要素を取得します。キーワードにスペースが含まれている場合は、変数名を引用符で囲む必要があります。
キー= EOF
頭字語[$ KEY] =「フレームの終わり」
エコー$ {頭字語[EOF]}
エコー$ {acronyms [$ key]}
創造的な
私たちの例は、辞書のように、各アレイ要素が他のすべてのものとは無関係である情報のコレクションです。それぞれが固有の定義です。しかし、連想配列は、さまざまなコンピュータハードウェアの仕様など、一つのことに関連するさまざまな情報を簡単に保持することができます。
-A仕様を宣言する
仕様[CPU] =「デュアルコアAMD RYZEN 5 3600」
指定[Speed] = "3600 MHz"
指定[カーネル] = "5.11.0-17-generic x86_64"
仕様[MEM] = "1978.5 MIB"
仕様[Storage] = "32 Gib"
仕様[シェル] =「BASH」
エコー$ {仕様[CPU]}
言語で効率的に書き込むことは、それが提供するメカニズムと構造を知ることを意味し、解決しようとしている問題に対して最も適切なものを選択することを意味します。連想配列は、辞書のように、名前で検索できるデータを格納する方法を簡単にします。