GNU/Linux >> Linux の 問題 >  >> Linux

Bashスクリプティング–例で説明された連想配列

これは、bash配列の一部としての2番目の記事です。前回の記事では、Bashのインデックス付き配列を操作する方法について説明しました。 。このガイドでは、Bash連想配列について説明します。 Linuxの例で詳細に説明します。

連想配列は、キーと値のペアに基づいて機能します。一部の言語では、辞書とも呼ばれます またはハッシュマップ 。インデックス付き配列と連想配列の主な違いは、インデックス付き配列はインデックス値に基づいて機能し、配列内の各要素は配列の特定のインデックス位置にマップされることです。連想配列は「キー」を使用します インデックス位置の代わりに値をマップします。

飛び込んで、bashで連想配列を使用する方法を見てみましょう。

連想配列を初期化する

インデックス付き配列とは異なり、declareを使用せずに連想配列を初期化することはできません。 指図。

declareを使用します -Aを使用したコマンド フラグ。

$ declare -A STAR_PLAYERS=()

これで、 "STAR_PLAYERS"という名前の空の配列になります。 創造された。必要に応じて、初期化中に直接配列に要素を追加することもできます。

$ declare -A STAR_PLAYERS=( [Argentina]="Messi" [Brazil]="Neymar" [England]="Kane" )

上記のコードでは、キーは角かっこで囲まれており、値の後にはスペースを入れずに等号を付ける必要があります。要素間の区切り文字としてコンマやセミコロンを使用する必要はありません。

読みやすくするために、配列要素を複数の行に書き込むことができます。

$ declare -A STAR_PLAYERS=(
 [Argentina]="Messi"
 [Brazil]="Neymar"
 [England]="Rooney"
)

配列要素を表示

echoを使用する必要があります またはprintf 配列の内容を出力するには、bashでコマンドを実行します。特殊変数*の使用方法と同様です および@ インデックス付き配列を印刷するには、連想配列の印刷にも同じものを使用する必要があります。

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

*には大きな違いがあります および@ *の違いを知る および@ 配列との連携については、 Bash For Loopの「Loopoverarrayelements」のセクションを参照してください。 ガイド。

*を使用せずに配列要素を印刷しようとした場合 または@ 、出力は空になります。

$ echo ${STAR_PLAYERS}

また、上記の出力を見ると、値のみが出力され、キーは出力されません。印刷する値は順序付けられません。キーを使用して特定の要素の値を取得できます。

$ echo ${STAR_PLAYERS[Brazil]}

配列に新しい要素を追加する

配列に新しい要素を追加するのは簡単です。以下に示すように、新しいキーと値のペアを作成するだけです。

$ STAR_PLAYERS[Belgium]="Hazard"
$ echo ${STAR_PLAYERS[@]}

配列にすでに存在する同じキーを使用しようとすると、値は新しいキーで上書きされます。

$ STAR_PLAYERS[England]="Sterling"
$ echo ${STAR_PLAYERS[@]}

配列に新しい要素を追加します

次の構文を使用して、配列に要素を追加することもできます。

$ STAR_PLAYERS+=([Spain]="Ramos")
$ echo ${STAR_PLAYERS[@]}

印刷キーと値のペア

前の例から、値のみが出力されることを理解しているかもしれません。 "!"の前に付けることで、キーのリストだけを取得できます。 配列のシンボル。

$ echo ${!STAR_PLAYERS[@]}

キーと値の両方を同時に出力する場合は、for loopを使用できます。

for elem in "${!STAR_PLAYERS[@]}"
do
 echo "key : ${elem}" -- "value: ${STAR_PLAYERS[${elem}]}"
done

連想配列の長さ

"#"の前に付けることで、連想配列の長さ、つまり配列に存在する要素の総数を取得できます。 配列を持つシンボル。これは、インデックス付き配列でも一般的です。

$ echo ${#STAR_PLAYERS[@]}

要素が配列に存在するかどうかを確認します

特定の要素で処理を行う前に、その要素がすでに配列に存在するかどうかを確認したい場合があります。これを行うには多くの方法がありますが、以下が最も簡単な方法です。

-nで条件文を使用しています ${STAR_PLAYERS[Argentina]}から返された文字列の長さをチェックするフラグ ゼロ以外です。指定されたキーを展開し、値が実際に-nに対してチェックされます。 フラグ。

if [[ -n "${STAR_PLAYERS[Argentina]}" ]] 
then
  echo "Element is present"
else
  echo "Element not present"
fi

読み取り専用の連想配列

連想配列を読み取り専用にすることができます。読み取り専用状態では、配列が初期化されると、配列に新しい要素を追加したり、配列内の値を変更したりすることはできません。 declareと一緒に -rを使用する必要があるコマンド フラグ。

$ declare -r -A STAR_PLAYERS=(
 [Argentina]="Messi"
 [Brazil]="Neymar"
 [England]="Rooney"
)
$ STAR_PLAYERS[Spain]="Ramos"
$ STAR_PLAYERS[England]="Sterling"
$ echo ${STAR_PLAYERS[@]}

要素を削除

配列から特定の要素を削除する場合は、unsetを使用できます。 要素キー名を指定したコマンド。たとえば、要素を削除したい場合(Spain="Ramos" )、構文は次のようになります。

$ unset STAR_PLAYERS[Spain]

配列を空にする

以下に示すように、配列を再初期化することで、配列からすべての要素を削除して空にすることもできます。

$ echo ${STAR_PLAYERS[@]}
$ declare -A STAR_PLAYERS=()

アレイを削除

アレイを削除する場合は、キーなしでアレイ名を使用できます。

$ unset STAR_PLAYERS

結論

この記事では、bashの連想配列とその機能のいくつかを見てきました。 bashの欠点は、ロジックを手動で作成するか、外部ツールを使用して目的の結果を得る必要があることです。たとえば、連想配列をjsonオブジェクトに変換する必要がある場合は、 jqを使用する必要があります。 bashに組み込まれていないツール。ここで、配列やその他のデータ構造を操作する必要があるときに使いやすいメソッドを提供するPythonを試してみる必要があります。

関連記事:

  • Bashスクリプティング–ループの説明中およびループまで
  • Bashスクリプティング–例で説明されているForループ
  • Bashスクリプティング–例で説明されている関数
  • Bashスクリプティング–例で説明されている変数
  • 例を使用して説明されたBashリダイレクト
  • Linuxの例で説明されているBashEchoコマンド
  • 初心者向けのBashヒアドキュメントチュートリアル

Linux
  1. 例を含む Bash 配列

  2. 例を含む Bash If-Else ステートメント

  3. 5つの実用的な例で説明されたAWK配列

  1. 例を使用してBashスクリプトを作成する方法

  2. 例を使用したBashヒアドキュメントチュートリアル

  3. 15 の例を含む究極の Bash Array チュートリアル

  1. Bashの連想配列

  2. Linuxの例で説明されたBashエコーコマンド

  3. 例で説明されたBashリダイレクト