mapfileコマンドはBashの組み込みコマンドで標準入力から行を読み込み、その内容を配列変数に代入します。使い方はreadコマンドに似ています。配列変数には標準入力からの内容を改行で区切って、それぞれの要素に入ります。
また、同じ機能の別名コマンドとしてreadarrayコマンドがあります。
目次
mapfileコマンドの利用例
配列変数に代入
(オプションなし)
mapfileコマンドは変数名を引数に取ります。標準入力から内容を読み込み、それぞれの行を配列の要素に格納していきます。それぞれの要素の最後に改行が入っていることに注意が必要です。
data.txt
1 2 3 |
aaa bbb ccc |
コマンド例と実行結果
1 2 3 4 5 6 |
$ mapfile var < data.txt $ declare -p var declare -a var='([0]="aaa " [1]="bbb " [2]="ccc ")' |
引数が何も指定されていない場合は、変数MAPFILEに代入されます。
コマンド例と実行結果
1 2 3 4 5 6 |
$ mapfile < data.txt $ declare -p MAPFILE declare -a MAPFILE='([0]="aaa " [1]="bbb " [2]="ccc ")' |
区切り文字を取り除く
(-tオプション)
-tオプションを用いると配列要素の最後に入る区切り文字を取り除いて、データを格納できます。
コマンド例と実行結果
1 2 3 |
$ mapfile -t var < data.txt $ declare -p var declare -a var='([0]="aaa" [1]="bbb" [2]="ccc")' |
最初のn行を切り捨てる
(-sオプション)
-sオプションを用いると標準入力より最初の行から指定した数字分だけを切り捨てた状態でデータを格納できます。
data2.txt
1 2 3 4 5 |
aaa bbb ccc ddd eee |
コマンド例と実行結果
1 2 3 4 5 6 |
$ mapfile -s 2 var < data2.txt $ declare -p var declare -a var='([0]="ccc " [1]="ddd " [2]="eee ")' |
標準入力から代入する行数を指定
(-nオプション)
-nオプションを用いるとどこまでの行数を配列変数に格納するかを指定できます。
行数に0を指定した場合、全ての行が配列変数に格納されます。
data2.txt
1 2 3 4 5 |
aaa bbb ccc ddd eee |
コマンド例と実行結果
1 2 3 4 5 6 |
$ mapfile -n 3 var < data2.txt $ declare -p var declare -a var='([0]="aaa " [1]="bbb " [2]="ccc ")' |
配列変数の開始要素番号を指定
(-Oオプション)
-Oオプションはどの要素番号からデータを格納するかの指定できます。デフォルトでは0からデータが格納されていきます。
data.txt
1 2 3 |
aaa bbb ccc |
コマンド例と実行結果
1 2 3 4 5 6 |
$ mapfile -O 3 var < data.txt $ declare -p var declare -a var='([3]="aaa " [4]="bbb " [5]="ccc ")' |
ファイルディスクリプタを指定して入力
(-uオプション)
リダイレクトをするときに'>'や'<'の前に数字を入れる場合、その数字はファイルディスクリプタ(file descriptor, fd)を表します。よく使用されるファイルディスクリプタとして、0が標準入力、1が標準出力、2が標準エラー出力を表します。'>'を指定してfdを省略した場合は、1の標準出力が、'<'を指定してfdを省略した場合は0が使用されます。
-uオプションを用いるとファイルディスクリプタを指定して入力を行うことができます。また、ファイルディスクリプタの設定を変更するコマンドとしてexecコマンドがあります。
コマンド例と実行結果
1 2 3 4 5 6 |
$ mapfile -u 5 var 5<data.txt $ declare -p var declare -a var='([0]="aaa " [1]="bbb " [2]="ccc ")' |
コールバック
(-Cオプション)
-Cオプションを用いるとコールバック(callback)を設定できます。コールバックは一定の行が読み込まれたときに呼び出され、配列変数に代入される前に評価されます。
コールバックが呼び出される行は-cオプションで指定します。デフォルトでは5000になります。
コールバックが評価されるときに追加の引数として、配列変数に割り当てられる要素番号とその内容が渡されます。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 |
$ mapfile -C 'echo -n' -c 1 var <data.txt 0 aaa 1 bbb 2 ccc $ $ func() { echo -n "num:$1 content:$2"; } $ mapfile -C 'func' -c 1 var <data.txt num:0 content:aaa num:1 content:bbb num:2 content:ccc |