使い方
丸括弧 ()
で囲まれた内容が、区切りを維持したまま配列として代入される。
$ array=( "hoge fuga" "piyo" ) $ for var in "${array[@]}"; do echo "$var"; done hoge fuga piyo
ドキュメント:
Array variables | Bash Guide for Beginners (tldp.org)
Arrays | Advanced Bash-Scripting Guide (tldp.org)
参考:
配列の使い方/サンプルでわかる最低限の知識 | バイオインフォ 道場
配列を使用する | UNIX & Linux コマンド・シェルスクリプト リファレンス
How to Use Arrays | LinuxConfig.org
Split String Into Array | nixCraft
How to Split String with a Delimiter | TecAdmin
Convert a Delimited String into an Array | timmurphy.org
How to convert a string into array – Unix & Linux Stack Exchange
配列の初期化
参考:
シェルスクリプトでの配列の初期化の速度 | rcmdnk’s blog
要素を追加する
参考:
Add a new element to an array without specifying the index in Bash – Stack Overflow
要素を削除する
参考:
Remove an element from a array – Stack Overflow
スライス
指定した添え字範囲の要素を抜き出す。
$ array=( a b c d e ) $ echo ${array[@]:1:3} b c d
参考:
要素数を取得する
$ array=( a b c d e ) $ echo ${#array[@]}
参考:
最後の要素を取得する
$ array=( a b c d e ) $ echo ${array[@]:${#array[@]}-1}
参考:
引数を配列に格納する
args=("$@") argn=$# for (( i = 0; i < $argn; i++ )); do echo ${args[$i]} done
参考:
デリミタを指定して分割する
一時的に IFS
を変更して、read
コマンドに -a
オプションを指定して配列に読み出す。
$ str="a,b,c,d,e" $ IFS="," read -a array <<< "$str" $ echo ${#array[@]}
参考:
Split String into Array | Linux Hint
Split String into Array Using 4 Simple Methods | GoLinuxCloud
How to Split String into Array | Linux Handbook
Split a List by Comma | Baeldung
Convert a delimited string into an array in Bash | timmurphy.org
How to convert a string into array – Unix & Linux Stack Exchange
How to split a string into an array? – Stack Overflow
パスを分割する
一時的に IFS
をコロンに変更して、read
コマンドに -a
オプションを指定して配列に読み出す。
IFS=':' read -d '' -r -a paths < <( echo "$PATH" )
もしくは、ヒアストリングを使う。
IFS=':' read -d '' -r -a paths <<< "$PATH"
参考:
split string on delimiter, assign segments to array – Stack Overflow
文字列として連結する
配列の内容をコンマで区切って文字列として連結する。
str="$( IFS=,; echo "${array[*]}" )"
参考:
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
mapfile Builtin Command – Help and Examples | Computer Hope’s Free Computer Help
mapfile Biltin Command | Bash Hackers Wiki
Creating an array from a text file – Stack Overflow
Putting string with newline separated words into array – Unix & Linux Stack Exchange
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 – 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 – Stack Overflow
How to use ‘readarray’ to read lines from a file into a 2D array – Stack Overflow