配列の使い方

() で囲まれた内容が、区切りを維持したまま配列として代入される。

$ array=( "hoge fuga" "piyo" )
$ for var in "${array[@]}"; do echo "$var"; done
hoge fuga
piyo

参考:

bash 配列まとめ – Qiita

bash の配列のまとめ – それマグで!

シェルの配列について – TASK NOTES

配列を使用する | UNIX & Linux コマンド・シェルスクリプト リファレンス

Bash で覚えておくとよいデータ構造 – 配列 – いろいろ解析日記

How to use arrays in bash script – LinuxConfig.org

Array variables – Bash Guide for Beginners | The Linux Documentation Project

Arrays – Advanced Bash-Scripting Guide | The Linux Documentation Project

HowTo: Bash Shell Split String Into Array – nixCraft

How to Split String with a Delimiter in Bash Script – TecAdmin

How to convert a String into Array in shell script – Unix & Linux Stack Exchange

Convert a delimited string into an array in Bash | timmurphy.org

デリミタを指定して分割する

参考:

Convert a delimited string into an array in Bash | timmurphy.org

split/join

参考:

Bash の配列で join や split する – Qiita

How to join elements of an array in Bash | zaiste.net

ファイルを配列に読み込む

参考:

テキストファイルを行単位で配列に読み込む | 本を読む

テキストファイルを1行ずつ読み込んで配列に格納したい。| teratail

標準入力を1行ずつ配列変数に入れるまとめ – Qiita

read -a

一行をデリミタで分割して、配列として変数に読み込む

$ IFS=$' \t\n'
$ read -a array < <( echo "hoge fuga piyo" )
$ for var in "${array[@]}"; do echo "$var"; done
hoge
fuga
piyo

ヒアストリングを使った場合

$ IFS=$' \t\n'
$ read -a array <<< "hoge fuga piyo"
$ for var in "${array[@]}"; do echo "$var"; done
hoge
fuga
piyo

参考:

How can I read user input as an array in Bash? – Ask Ubuntu

Split string into an array in Bash – Stack Overflow

Reading a delimited string into an array in Bash – Stack Overflow

mapfile/readarray

ファイルの各行を配列の要素として取り込む(-t:改行を取り除く)

$ mapfile -t array < file.txt

参考:

テキストファイルを行単位で配列に読み込む | 本を読む

テキストファイルを1行ずつ読み込んで配列に格納したい。| teratail

Bash mapfile builtin command help and examples | Computer Hope’s Free Computer Help

The mapfile builtin command | Bash Hackers Wiki

Creating an array from a text file in Bash – Stack Overflow

for 文で要素を一つずつ処理する

配列の要素を一つずつ処理する

for elem in "${array[@]}"; do
  echo "$elem"
done

配列のインデックスを使って処理する

for i in "${!array[@]}"; do
  edho "${array[$i]}"
done

参考:

bash の配列を for ループで使う – 知に至る病

Looping over arrays, printing both index and value – Stack Overflow

デリミタの扱い

タブで分割する例(unset IFS はデフォルトのスペース・タブ・改行区切りとなる。)

$ unset IFS
$ read -a array <<< "hoge"$'\t'"fuga"$'\t'"piyo"
$ for var in "${array[@]}"; do echo "$var"; done
hoge
fuga
piyo

タブで分割しない場合、配列に代入された結果は分割されていない一つの要素のみである。(IFS の設定が空文字 IFS="" の場合、分割は一切行われない。)

$ IFS=""
$ read -a array <<< "hoge"$'\t'"fuga"$'\t'"piyo"
$ for var in "${array[@]}"; do echo "$var"; done
hoge    fuga    piyo

IFS にタブが含まれていても、"${array[@]}" のようにダブルクォーテーションで囲われていれば再分割されない。

$ unset IFS
$ for var in "${array[@]}"; do echo "$var"; done
hoge    fuga    piyo

ダブルクォーテーションで囲われていない場合、IFS の設定に従って分割される。

$ unset IFS
$ for var in ${array[@]}; do echo "$var"; done
hoge
fuga
piyo

ダブルクォーテーションで囲っていなくても、IFS="" とすれば再分割は行われない。

$ IFS=""
$ for var in ${array[@]}; do echo "$var"; done
hoge    fuga    piyo

二次元配列を扱う

参考:

How to declare 2D array in bash – Stack Overflow

How to use ‘readarray’ in bash to read lines from a file into a 2D array – Stack Overflow

Tagged:

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です