bashとは?
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 の最初の値で区切ることで任意の文章を分割し、配列に入力することができます。詳細は後ほどお伝えします。
配列の実際の例は?
これから実際の活用方法を例題を中心に解説していきます。変数に値を設定する他、コマンドの結果を代入したり、ファイルから入力したり多くの使い方があります。具体的には以下の使い方について説明していきます。
・配列を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の配列をマスターし、集計に活用しましょう
bashはコマンドインタプリタのため、開発作業は難しくありません。bashのオンライン利用サイトもありますので、インストールすることなく利用することもできます。bashの配列が理解できたらファイル集計や分析に活用することをおすすめします。
編集部オススメコンテンツ
アンドエンジニアへの取材依頼、情報提供などはこちらから