使い方

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

$ 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)

参考:

配列まとめ – Qiita

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

配列の使い方/サンプルでわかる最低限の知識 | バイオインフォ 道場

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

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

配列 | いろいろ解析日記

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

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

参考:

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

要素数を取得する

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

参考:

配列のサイズ/要素数を調べる | まくまくノート

配列の要素数を調べる | あんみのの備忘録

配列の要素数を取得する | DocumentRoot

最後の要素を取得する

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

参考:

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

引数を配列に格納する

args=("$@")
argn=$#

for (( i = 0; i < $argn; i++ )); do
    echo ${args[$i]}
done

参考:

引数を配列にセットする | エンジニアきまぐれ Tips

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

一時的に 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[*]}" )"

参考:

配列を 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

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

参考:

配列を 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 – 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

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

参考:

配列比較 – Qiita

二次元配列を扱う

参考:

How to declare 2D array – Stack Overflow

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

Tips

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

記事をシェアする:
タグ:

コメントを残す

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

Protected by reCAPTCHA