配列の使い方
()
で囲まれた内容が、区切りを維持したまま配列として代入される。
$ array=( "hoge fuga" "piyo" ) $ for var in "${array[@]}"; do echo "$var"; done hoge fuga piyo
参考:
配列を使用する | UNIX & Linux コマンド・シェルスクリプト リファレンス
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
パスを分割する
IFS=':'
を指定して read -a
で配列に読み込む。
IFS=':' read -d '' -r -a paths < <( echo "$PATH" )
もしくは、ヒアストリングを使う。
IFS=':' read -d '' -r -a paths <<< "$PATH"
参考:
Bash split string on delimiter, assign segments to array – Stack Overflow
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
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
参考:
複数のリストのループをシェルスクリプトでもやりたい | 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
二つの配列の共通部分を取得する
参考:
二次元配列を扱う
参考:
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
参考: