logologo
bashの配列とは?事例で分かる配列の使い方をまとめて紹介
bash

bashの配列とは?事例で分かる配列の使い方をまとめて紹介

アンドエンジニア編集部
2021.08.28
この記事でわかること
bashの配列は1次元のインデックス配列と連想配列が用意されています
bashの配列は変数の数値も文字列と区別されずに文字列として扱われます
bashの配列はcsvファイルの読み込みや、grepを用いた集計にも利用できます

bashとは?

bash shell

bashとはUNIX系システムで用いられているシェルです。bashとは、「Bourne-again shell」の頭文字をとった名称です。簡単に言うと、bashはBourne Shellのフリーソフトウェア版として機能を継承しつつ、C ShellやKornShellの機能を取り入れたシェルと言えます。

現在、bashはLinuxやMacOSおよびMicrosoft Windowsでも対応する代表的なシェルと位置づけれています。bashのリファレンスマニュアルおよび関連情報は以下のサイトから入手可能です。 参考:GNU Bash 参考:Bash Reference Manual

bashの配列とは?

bashの配列は1次元インデックス配列および連想配列2種類からなります。なお、bashでは残念ながら2次元配列は用意されていません。なお、bashの変数では数字と文字列の区別なく文字列として扱われます。

1次元インデックス配列  添字に1次元の数値を用いる配列で、添字は0から始まります。 使用例:  fruits[0]=110  fruits[1]=80

連想配列  文字列をインデックスに用いる配列で、バージョン4から追加された宣言です。 使用例:   declare -A fruits   fruits[apple]=110   fruits[orange]=80

具体的な使い方は以降で説明していきます。

bashの配列の宣言方法は?

bashの配列の宣言は、以下の構文を用います。bashの配列変数は、インデックス毎の個別代入または複合代入(一括代入)が可能です。以下は個別代入の構文です。 構文:  変数名[添字]=値 使用例:  fruits[0]=110  fruits[1]=80

同様に以下の構文で宣言と複数の値設定が行われます。複合代入と言います。 構文:  変数名=(値 値,,) 使用例:  fruits=(110 80) 値設定せずに配列宣言のみ行う場合は、値を指定せずに以下の構文で行います。 構文:  変数名=() 使用例:  fruits=()

bashの配列の値の参照方法は?

配列変数の値を参照するには、以下の構文を用います。 構文:  ${変数名[添字]} 使用例:  echo ${fruits[1]} 配列変数の全ての値を参照するには、以下の構文を用います。 構文:  ${変数名[@]} または${変数名[*]} 使用例:  fruits=(110 80 95)  echo ${fruits[@]} 実行結果:  110 80 95

配列変数の全ての添字を参照するには、以下の構文を用います。 構文:  ${!変数名[@]} または${!変数名[*]} 使用例:  fruits=(110 80 95)  echo ${!fruits[@]} 実行結果:  0 1 2

bashの配列の数の確認方法は?

配列変数の数を確認するには、以下の構文を用います。 構文:  ${#変数名[@]}  使用例:  fruits=(110 80 95)  echo ${#fruits[@]} 実行結果:  3

bashの配列宣言の補助機能とは?

配列の補助機能としてdeclare 組み込みコマンドが用意されています。連想配列を宣言するには以下の様に行います。 構文:   declare -A 変数 使用例:  declare -A fruits  fruits[grape]=99  fruits[apple]=110  fruits[orange]=80  fruits[banana]=95  echo ${!fruits[@]}  echo ${fruits[@]} 実行結果:  grape apple banana orange  99 110 95 80

その他にもdeclareと readonlyを用いて、配列変数に対して属性を設定することができます。

bashの配列の制限は?

bashの配列の制限ほとんどありません配列変数のサイズ上限はありませんし、インデックス付けや代入を連続で行う必要もありません。 同様に連想配列では任意の文字列を用いることができます

配列の使い方は?

先に紹介した通り、変数名=(値 値,,)という形式の複合代入を用いるか、変数名[添字]=値という個別代入方式で配列を使います。

配列の任意の要素は、${変数名[添字]} を使って参照します。添字が”@”または”*”の場合は全要素が参照可能です。ただし、変数をダブルクォートで括った際に”@”は要素を分解し、”*”は1つの単語として処理します。

使用例:”@”を用いた場合  fruits=(110 80 95)  for i in "${fruits[@]}"; do     echo $i  done 実行結果:  110  80  95

使用例:”*”を用いた場合  fruits=(110 80 95)  for i in "${fruits[*]}"; do     echo $i  done 実行結果:  110 80 95

上記例では”@”を用いた際には、3回echo文が実行されています。また”*”を用いた際には1回のみecho文が実行されていることが分かります。

その他の機能として、特殊変数 IFS の最初の値で区切ることで任意の文章を分割し、配列に入力することができます。詳細は後ほどお伝えします。

配列の実際の例は?

case study

これから実際の活用方法を例題を中心に解説していきます。変数に値を設定する他、コマンドの結果を代入したり、ファイルから入力したり多くの使い方があります。具体的には以下の使い方について説明していきます。

配列をfor文のループ処理に利用する方法カンマ区切りを配列に取り込む方法改行区切りを配列に取り込む方法配列を引数渡しする方法配列をソートする方法配列にコマンド結果を用いる方法配列を削除する方法

配列をfor文のループ処理に利用するには?

配列をfor文のループ処理に利用する場合は${!変数名[@]}を使います。

使用例:インデックス配列の場合  fruits=(110 80 95)  for i in "${!fruits[@]}"; do    echo $i"番目の価格は" ${fruits[$i]}"円です"  done 実行結果:  0番目の価格は 110円です  1番目の価格は 80円です  2番目の価格は 95円です

使用例:連想配列の場合  declare -A fruits  fruits[grape]=99  fruits[apple]=110  fruits[orange]=80  fruits[banana]=95  for i in "${!fruits[@]}"; do    echo $i"の価格は" ${fruits[$i]}"円です"  done 実行結果:  grapeの価格は 99円です  appleの価格は 110円です  bananaの価格は 95円です  orangeの価格は 80円です

カンマ区切りを配列に取込むには?

カンマ区切りを処理するために IFS環境変数を使います。IFSはInternal Field Separatorの略です。デフォルトではスペースとタブ、改行が文字区切りに設定されています。

使用例:カンマ区切りを変数に取込む例  ORG_IFS=$IFS  strings="This,is,a pen"  IFS=’,’  for i in $strings;do    echo $i  done  IFS=$ORG_IFS 実行結果:  This  is  a pen

使用例:カンマ区切りで配列に取込む例  ORG_IFS=$IFS  strings="This,is,a pen"  IFS=’,’  read -ra arrays <<< "$strings"  for i in "${arrays[@]}";do    echo $i  done  IFS=$ORG_IFS 実行結果:  This  is  a pen

この例では文字列変数から文字列を取り込んでいますが、入力元をファイルにすれば簡単にCSVファイルの読み込みが可能です。

改行区切りを配列に取り込むには?

改行区切りを配列に取り込む場合は、カンマ区切りと同様にIFS環境変数を指定し’\n’(改行)を区切りに指定します。ファイルの行単位に処理する際にも同様の処理で利用可能です。

使用例:  ORG_IFS=$IFS  strings='  This  is  a pen  '  IFS=$'\n'  arrays=($strings)  echo "No.of lines="${#arrays[@]}  for i in "${arrays[@]}";do    echo $i  done  IFS=$ORG_IFS 実行結果:  No.of lines=3  This  is  a pen

配列を関数の引数渡しするには?

配列を関数の引数渡しするには、関数で”declare -n”により名前参照を用います。先ほどの連想配列の事例を関数で使用してみます。また引数は連想配列を宣言し、複合代入で値を設定してみます。

使用例:  print_fruits()  {     declare -n parm=$1     for i in ${!parm[@]}; do        echo $i"の価格は" ${fruits[$i]}"円です"     done  }  declare -A fruits=([grape]=99 [apple]=110 [orange]=80 [banana]=95)  print_fruits fruits 実行結果:  grapeの価格は 99円です  appleの価格は 110円です  bananaの価格は 95円です  orangeの価格は 80円です

配列をソートするには?

配列をソートする場合はsortを用います。”sort -n”は数字でソートし、指定しない場合は文字列でソートします。

使用例:  ORG_IFS=$IFS  IFS=$'\n'  fruits=(99 110 80 95)  fruits_sort=($(echo "${fruits[*]}"|sort -n))  echo ${fruits[*]}  echo ${fruits_sort[*]}  IFS=$ORG_IFS 実行結果:  99 110 80 95  80 95 99 110

配列にコマンド結果を使うには?

配列にコマンド結果を使うと集計が便利です。特に正規表現はデータを抽出する際に利用すると集計が効率的に行えます。具体的にはgrepコマンドの結果を用いて検索する際に利用します。

使用例:input-file.txtから最初の文字がAからCで始まる行を取り込み、配列に入れる例  ORG_IFS=$IFS  IFS=$'\n'  arrays=($(grep -E “^[A-Ca-c]” input-file.txt))  IFS=$ORG_IFS

配列を削除するには?

配列を削除するにはunsetを使います。

構文:添字の配列のみ削除  unset 変数名[添字] 使用例:  unset fruits[1]

構文:全ての配列を削除  unset 変数名、またはunset 変数名[*]、またはunset 変数名[@] 使用例:  unset fruits、またはunset fruits[*]、またはunset fruits[@]

bashの配列をマスターし、集計に活用しましょう

calculation

bashはコマンドインタプリタのため、開発作業は難しくありません。bashのオンライン利用サイトもありますので、インストールすることなく利用することもできます。bashの配列が理解できたらファイル集計や分析に活用することをおすすめします。

気になる人のXをフォローしよう!
公式LINE
公式YouTube
マイナビITエージェント

編集部オススメコンテンツ

thumb_gptowten_01
ChatGPTの面白い使い方15選!ビジネスや遊び相手になる事例
アンドエンジニア編集部
2024.02.19

アンドエンジニアへの取材依頼、情報提供などはこちらから

お問い合わせ・情報提供

カテゴリー

編集部おすすめコンテンツ

アンドエンジニアへの取材依頼、情報提供などはこちらから

logologo
Powered by マイナビ AGENT