Bash 配列を使用してデータを操作および制御する方法

Bash Pei Liewo Shi Yongshitedetawo Cao Zuooyobi Zhi Yusuru Fang Fa



配列変数は、インデックスを使用して複数の値を格納するために、任意のプログラミング言語で使用されます。配列インデックスには数値または文字列を指定できます。数値のインデックスを含む配列を「数値配列」と呼び、文字列値をインデックスとして含む配列を「連想配列」と呼びます。数値配列と連想配列の両方を Bash で作成できます。このチュートリアルでは、Bash 配列のデータを操作および制御する方法を 15 の例を使用して詳細に示します。

コンテンツのリスト:

  1. インデックスによる配列の定義
  2. 複数の値を含む配列を定義する
  3. 連想配列の定義
  4. 配列の値を数える
  5. ループによる配列値の読み取り
  6. 配列の特定の値を読み取る
  7. 配列値を挿入する
  8. ファイルの内容を配列に読み取る
  9. 配列値を結合する
  10. 配列値を変更する
  11. 配列値を削除する
  12. 配列値の検索と置換
  13. 配列を関数の引数として使用する
  14. 関数から配列を返す
  15. 配列を空にする

インデックスによる配列の定義

順次または非順次の数値インデックスを指定して配列を宣言する方法を次のスクリプトに示します。このタイプの配列は数値配列と呼ばれます。ここで、「$books」配列は 3 つの連続インデックスを定義することによって作成され、「$products」配列は 4 つの非連続インデックスを定義することによって作成されます。両方の配列のすべての値は、「printf」関数を使用して出力されます。







#!/bin/bash

#配列のインデックスを順番に定義する

[ 0 = 「bash シェルを学ぶ」

[ 1 = 「bash を使用したサイバーセキュリティ運用」

[ 2 = 「Bash コマンド ライン プロのヒント」

エコー 「最初の配列のすべての値:」

プリントフ '%s\n' ${書籍[@]}

#配列インデックスを不連続な順序で定義する

製品 [ 10 = 'ペン'

製品 [ 5 = '鉛筆'

製品 [ 9 = 「ルーラー」

製品 [ 4 = 「A4サイズの紙」

エコー

エコー 「2 番目の配列のすべての値:」

プリントフ '%s\n' ${製品[@]}

出力 :



スクリプトを実行すると、次の出力が表示されます。両方の配列の値が出力に表示されます。インデックスの順序は、非順次インデックスの配列の印刷時に維持されます。



  p1





トップへ戻る

複数の値を含む配列を定義する

複数の値を持つ数値配列は、-a オプションを指定して「declare」コマンドを使用するか、「declare」コマンドを使用せずに宣言できます。次のスクリプトでは、最初の配列は「declare」コマンドを使用して宣言され、2 番目の配列は「declare」コマンドを使用せずに作成されます。



#!/bin/bash

#'declare' キーワードを使用して数値配列を宣言する

宣言する -a 名前 = ( 「マイケル」 「デビッド」 「アレクサンダー」 「トーマス」 「ロバート」 「リチャード」 )

#配列の値を出力する

エコー 「最初の配列のすべての値:」

プリントフ '%s\n' ${名前[@]}

#'declare' キーワードを使用せずに数値配列を宣言する

= ( 「シェルスクリプトのチュートリアル」 「ビッシュバッシュボッシュ!」 「Bash を早く学ぶ」 )

#改行を追加

エコー

#配列の値を出力する

エコー 「2 番目の配列のすべての値:」

プリントフ '%s\n' ${書籍[@]}

出力 :

スクリプトを実行すると、次の出力が表示されます。両方の配列の値がここに出力されます。

  p2

トップへ戻る

連想配列の定義

文字列値をインデックスとして含む配列を連想配列と呼びます。 -A オプションは、Bash の「declare」コマンドとともに使用して、連想 Bash 配列を作成します。次のスクリプトでは、最初の連想配列はインデックスを個別に指定することによって宣言され、2 番目の配列は配列宣言時にすべてのキーと値のペアを指定することによって宣言されます。

#!/bin/bash

#値のない連想配列変数を宣言する

宣言する -A 従業員

#インデックスを定義して値を個別に割り当てる

従業員 [ 「ID」 = 「78564」

従業員 [ '名前' = 「出演可能な俳優」

従業員 [ '役職' = '最高経営責任者(CEO'

従業員 [ '給料' = 300000

#配列の 2 つの値を出力する

エコー '従業員ID: ${従業員[id]}

エコー '従業員名: ${従業員[名前]}

#値を含む連想配列を宣言する

宣言する -A コース = ( [ コード = 「CSE-206」 [ 名前 = 'オブジェクト指向プログラミング' [ クレジット時間 = 2.0 )

#改行を追加

エコー

#2 番目の配列の 2 つの配列値を出力します

エコー 'コース名: ${コース[名前]}

エコー 「クレジット時間: ${コース[クレジット時間]}

出力 :

スクリプトを実行すると、次の出力が表示されます。キーまたはインデックス値を指定すると、連想配列の特定の値がここに出力されます。

  p3

トップへ戻る

配列の値を数える

数値配列と連想配列の合計要素をカウントする方法を次のスクリプトに示します。

#!/bin/bash

#数値配列を宣言する

宣言する -a 名前 = ( 「マイケル」 「デビッド」 「アレクサンダー」 「トーマス」 「ロバート」 「リチャード」 ) ;

エコー 「数値配列の長さは ${#names[@]}

#連想配列を宣言する

宣言する -A コース = ( [ コード = 「CSE-206」 [ 名前 = 'オブジェクト指向プログラミング' [ クレジット時間 = 2.0 )

エコー 「連想配列の長さは ${#コース[@]}

出力 :

スクリプトを実行すると、次の出力が表示されます。数値配列と連想配列の配列長がここに出力されます。

  p4

トップへ戻る

ループによる配列値の読み取り

「for」ループを使用して数値配列と連想配列のすべての値を読み取る方法を次のスクリプトに示します。

#!/bin/bash

#数値配列を宣言する

宣言する -a = ( 「シェルスクリプトのチュートリアル」 「ビッシュバッシュボッシュ!」 「Bash をすばやく学習する」 )

#数値配列の値を出力する

エコー 「配列の数値値は次のとおりです。」

のために ${書籍[@]}

する

エコー $in

終わり

エコー

#値を含む連想配列を宣言する

宣言する -A クライアント = (

[ ID = 「H-5623」

[ 名前 = '氏。アナフ

[ 住所 = 「6/A、ダッカ、ダンモンディ。」

[ 電話 = 「+8801975642312」 )

#連想配列の値を出力する

エコー 「連想配列の値は次のとおりです。」

のために k ${!clients[@]}

する

エコー $k => ${クライアント[$k]}

終わり

出力 :

スクリプトを実行すると、次の出力が表示されます。ここでは、数値配列の値と連想配列のキーと値のペアが出力に出力されます。

  p5

トップへ戻る

配列の特定の範囲の値を読み取る

インデックスの特定の範囲の配列値を次のスクリプトに示します。スクリプトでは、4 つの要素の数値配列が定義されています。配列の 2 番目のインデックスからの 2 つの配列値が後で出力されます。

#!/bin/bash

#数値配列を宣言する

宣言する -a ケーキ = ( 'チョコケーキ' 「バニラケーキ」 「レッドベルベットケーキ」 'ストロベリーケーキ' )

#特定の配列値を出力する

エコー 「配列値の 2 番目と 3 番目の要素は次のとおりです。」

プリントフ '%s\n' ${ケーキ[@]:1:2}

出力 :

スクリプトを実行すると、次の出力が表示されます。配列の 2 番目と 3 番目の値は「Vanilla Cake」と「Red Velvet Cake」で、出力に表示されます。

  p6

トップへ戻る

配列値の挿入

配列の末尾に複数の値を追加する方法を次のスクリプトに示します。メイン配列「$books」には 3 つの要素が含まれており、「$books」配列の最後に 2 つの要素が追加されます。

#!/bin/bash

#数値配列を宣言する

宣言する -a = ( 「シェルスクリプトのチュートリアル」 「ビッシュバッシュボッシュ!」 「Bash をすばやく学習する」 )

#挿入前に配列値を出力する

エコー 「配列値:」

プリントフ '%s\n' ${書籍[@]}

エコー

= ( ${書籍[@]} 「Linux コマンドラインとシェル スクリプト バイブル」 「高度な Bash スクリプト ガイド (メンデル クーパー著)」 )

#挿入後に配列値を出力する

エコー 「2 つの値を挿入した後の配列値:」

プリントフ '%s\n' ${書籍[@]}

出力 :

スクリプトを実行すると、次の出力が表示されます。新しい値を挿入する前後の配列値が出力に出力されます。

  p7

トップへ戻る

ファイルの内容を配列に読み込みます

この例のスクリプトをテストするには、次の内容を含む「fruits.txt」という名前のテキスト ファイルを作成します。

果物.txt

マンゴー

パラミツ

パイナップル

オレンジ

バナナ

次のスクリプトでは、ファイルの内容が「$data」という名前の配列に保存されます。ここでは、ファイルの各行が配列の各要素として保存されます。次に、配列の値が出力されます。

#!/bin/bash

#ユーザーからファイル名を読み取る

読む -p 「ファイル名を入力してください:」 ファイル名

もし [ -f $ファイル名

それから

#ファイルの内容を配列に読み込みます。」

データ = ( ` $ファイル名 ` )

エコー 「ファイルの内容は次のとおりです。」

#ファイルを一行ずつ読み込む

のために ライン ${データ[@]}

する

エコー $line

終わり

なれ

出力 :

スクリプトを実行すると、次の出力が表示されます。 「cat」コマンドとスクリプトで同じファイルにアクセスするため、「cat」コマンドで表示される出力とスクリプトの出力は似ています。

  p8

トップへ戻る

配列値を結合する

新しい配列は、複数の配列の値を結合して作成されます。次のスクリプトでは、文字列の 2 つの数値配列が定義されています。次に、これらの配列の値を組み合わせて新しい配列が作成されます。

#!/bin/bash

#最初の配列を宣言する

宣言する -a 名前リスト1 = ( 「マイケル」 「デビッド」 「アレクサンダー」 「トーマス」 )

エコー 「最初の配列値は次のとおりです。」

プリントフ '%s、' ${nameList1[@]}

エコー

#2 番目の配列を宣言する

宣言する -a 名前リスト2 = ( 「ロバート」 「リチャード」 )

エコー 「2 番目の配列の値は次のとおりです。」

プリントフ '%s、' ${nameList2[@]}

エコー

#2 つの配列を結合して新しい配列を作成する

結合配列 = ( ${nameList1[@]} ${nameList2[@]} )

エコー 「結合された配列値は次のとおりです。」

プリントフ '%s、' ${combined_array[@]}

エコー

出力 :

スクリプトを実行すると、次の出力が表示されます。ここでは、3 つの配列の値が出力に表示されます。 3 番目の配列には、1 番目と 2 番目の配列のすべての値が含まれます。

  p9

トップへ戻る

配列値を変更する

インデックスを指定して 1 つ以上の配列値を更新する方法を次のスクリプトに示します。

#!/bin/bash

#最初の配列を宣言する

宣言する -a 名前リスト = ( 「マイケル」 「デビッド」 「アレクサンダー」 「トーマス」 )

エコー 「配列値:」

プリントフ '%s、' ${名前リスト[@]}

エコー

#配列の2番目の値を更新します

名前リスト [ 1 = 「ロバート」

エコー 「更新後の配列値:」

プリントフ '%s、' ${名前リスト[@]}

エコー

出力 :

スクリプトを実行すると、次の出力が表示されます。メイン配列と更新された配列の値が出力に表示されます。

  p10

配列値を削除する

「unset」コマンドは、配列の特定の要素またはすべての要素を削除するために使用されます。次のスクリプトでは、配列の 2 番目の要素が削除されます。

#!/bin/bash

#数値配列を宣言する

宣言する -a = ( 「シェルスクリプトのチュートリアル」 「ビッシュバッシュボッシュ!」 「Bash をすばやく学習する」 )

#削除する前に配列値を出力します

エコー 「配列値:」

プリントフ '%s\n' ${書籍[@]}

エコー

#2番目の要素を削除

設定を解除する [ 1

#削除後に配列値を出力する

エコー 「2 番目の値を削除した後の配列値:」

プリントフ '%s\n' ${書籍[@]}

出力 :

スクリプトを実行すると、次の出力が表示されます。メイン配列の値と 1 つの値を削除した後の配列値が出力に表示されます。

  p11

トップへ戻る

配列値の検索と置換

次のスクリプトでは、パターンで定義された検索値が「$names」配列のいずれかの値と一致した場合、配列の特定の値が別の値に置き換えられます。

#!/bin/bash

#最初の配列を宣言する

宣言する -a 名前 = ( 「マイケル」 「デビッド」 「アレクサンダー」 「トーマス」 )

#元の配列値を出力する

エコー 「元の配列値:」

プリントフ '%s\n' ${名前[@]}

#配列の値を置き換えた後に文字列を生成する

更新された配列 = ${names[@]/アレクサンダー/リチャード}

#置換後の配列値を出力する

エコー 「置換後の配列値:」

プリントフ '%s\n' ${updated_array[@]}

出力 :

スクリプトを実行すると、次の出力が表示されます。メイン配列の値と、値を置換した後の配列値が出力に表示されます。

  p12

トップへ戻る

配列を関数の引数として使用する

次のスクリプトでは、配列変数が関数の引数として渡され、その配列の値が後で出力されます。

#!/bin/bash

#数値の配列を宣言する

宣言する -a 数字 = ( 10 6 4.5 13 8 )

#引数値を取る関数を定義する

機能 ( )

{

#最初の引数を読む

数字 = 1ドル

#配列の値を出力する

エコー 「配列値:」

プリントフ '%d\n' ${数字[@]}

}

#配列を引数として関数を呼び出す

機能 ${数字[@]}

出力 :

スクリプトの実行後、次の出力が表示されます。

  p13

トップへ戻る

関数から配列を返す

次のスクリプトでは、4 つの数値引数を使用して関数が呼び出されます。引数値を使用して配列が作成され、その配列が関数から呼び出し元に返されます。

#!/bin/bash

#4 つの引数値を読み取る関数を定義する

機能 ( )

{

#引数の値を読み取る

数字 = ( 1ドル 2ドル 3ドル 4ドル )

#配列を返す

エコー ${数字[@]}

}

#3 つの引数を指定して関数を呼び出す

戻り値 =$ ( 機能 78 4.5 90 23 )

#戻り値を配列に格納する

読む -a 1つで <<< $return_val

#返された配列の値を出力します

エコー 「配列の値は次のとおりです。」

のために ${num[@]}

する

エコー $in

終わり

出力 :

スクリプトの実行後、次の出力が表示されます。

トップへ戻る

配列を空にする

次のスクリプトは、「unset」コマンドを使用して配列を空にする方法を示しています。配列値の合計数は、配列を空にする前後に出力されます。

#!/bin/bash

#数値の配列を宣言する

宣言する -a 数字 = ( 10 6 4.5 13 80 )

エコー 「配列値の数: ${#numbers[@]}

#配列を空にする

設定を解除する 数字

エコー 「配列を空にした後の配列値の数: ${#numbers[@]}

出力 :

スクリプトを実行すると、次の出力が表示されます。配列を空にした後、配列の要素数が 0 になりました。

  p15

トップへ戻る

結論

このチュートリアルでは、15 の簡単な例を使用して、Bash スクリプトで配列変数を宣言、アクセス、変更、削除するさまざまな方法を示します。このチュートリアルが、Bash ユーザーが Bash 配列の使い方を詳しく知るのに役立つことを願っています。