配列の使い方

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

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

参考:

配列まとめ – Qiita

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

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

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

配列 | いろいろ解析日記

スクリプトの配列操作 – GitHub Gist

How to use arrays in bash script | LinuxConfig.org

Array variables | Bash Guide for Beginners (tldp.org)

Arrays | Advanced Bash-Scripting Guide (tldp.org)

Bash Shell Split String Into Array | nixCraft

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

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

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

配列の初期化

参考:

シェルスクリプトでの配列の初期化の速度 | rcmdnk’s blog

要素を追加する

参考:

bash は変数や配列に += 演算子で値が追加できる | 知に至る病

Add a new element to an array without specifying the index in Bash – Stack Overflow

スライス

指定した添え字範囲の要素を抜き出す。

$ array=( a b c d e )
$ echo ${array[@]:1:3}
b c d

参考:

bash の配列変数に関する Tips | y-kawaz の日記

最後の要素を取り出す

$ array=( a b c d e )
$ echo ${array[@]:${#array[@]}-1}
e

参考:

bash の配列変数に関する Tips | y-kawaz の日記

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

参考:

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

push / pop

参考:

シェルスクリプトで配列への push / pop | MB blog

How to add/remove an element to/from the array in bash? – Unix & Linux Stack Exchange

要素が含まれるか判定する

参考:

How do I test if an item is in a bash array? – Unix & Linux Stack Exchange

Check if an element is present in a Bash array – Stack Overflow

Check if a Bash array contains a value – Stack Overflow

配列の要素から重複を取り除く

eval array=( $( printf "%q\n" "${array[@]}" | sort -u ) )

参考:

シェルスクリプトで重複するデータのない配列を作る方法 – スタック・オーバーフロー

How can I get unique values from an array in Bash? – Stack Overflow

Create new array with unique values from existing array – Unix & Linux Stack Exchange

How can I get the unique items in a bash array? – Super User

ファイルから配列に読み込む

参考:

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

テキストファイルを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

ファイルの各行を配列の要素として取り込む。

$ mapfile -t array < file.txt

-t:改行を取り除く

参考:

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

テキストファイルを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 ループで使う | 知に至る病

配列の全要素をループで取得する | 年中アイス

複数のリストのループをシェルスクリプトでもやりたい | teratail

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

Create array in loop from number of arguments – 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=""
$ 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

find コマンドの結果を配列に入れる

find コマンドに -print0 を指定してコマンド置換で実行し、readarray-d '' を指定して配列に格納する。

$ readarray -d '' stylesheets < <( find public/assets -name '*.css' -print0 )

-d は Bash 4.4 以降で利用可能

参考:

pipe ‘find’ output into ‘readarray’ – Unix & Linux Stack Exchange

How can I store the “find” command results as an array in Bash – Stack Overflow

Store the output of find command in an array – Stack Overflow

How to place the output of find in to an array – Super User

ソート

参考:

シェルスクリプトでの配列のソート | rcmdnk’s blog

二つの配列の共通部分を得る

参考:

bash で配列比較 – Qiita

二次元配列を扱う

参考:

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

Tips

参考:

bash の配列変数に関する Tips | y-kawaz の日記

Tagged:

コメントを残す

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