bashでシェルスクリプトを作成する際、
スクリプト中でファイルを読み込む処理を含めたいケースがある。

そんな場合は以下のスクリプトで対応可能である。

環境変数「IFS」

bashの場合「スペース」「タブ」「改行」($’ \t\n’)といった値が
環境変数「IFS」(Internal Filed Separator)には初期設定され、これらが文字の区切りとして認識されます。

そこでファイル等を読み込んだりする場合に、読み込む文の区切り文字を変更したい場合は、
「IFS」に区切り文字としたい値を設定することで、区切りとさせる文字を好きに設定することが出来ます。

例えばcsvファイルを読み込む場合等は「IFS」に「,」を設定するといったようにです。

それでは以下三例を紹介します。


ファイルを1行ずつ読み込む

lnは行番号、lineに一行毎のデータが格納される。

以下ファイルを作成し、実行権限を付与し、
引数にファイル名を指定して実行する。(例:./line.sh text.txt)

#!/bin/bash

IFS='
'
ln=0
while read -r line; do
    ln=`expr $ln + 1`
    printf '%3d %s\n' "$ln" "$line"
done < "$1"

テキストファイルを配列に読み込む

以下ファイルを作成し、実行権限を付与し、
引数にファイル名を指定して実行する。(例:./hairetsu.sh text.txt)

#!/bin/bash

IFS=$'\n'
file=(`cat "$1"`)
ln=0
for line in "${file[@]}"; do
    ln=`expr $ln + 1`
    printf '%3d %s\n' "$ln" "$line"
done < "$1"

指定した行を取得したい場合は以下

#!/bin/bash

IFS=$'\n'
file=(`cat "$1"`)
#
echo ${file[5]} #指定行を[]内に含める

CSVファイルを読み込む

csvを読み込んでHTMLのテーブルタグを付与。

引数にファイル名を指定して実行する。(例:./csvread.sh test.csv)

#!/bin/bash

IFS=$'\n'
file=(`cat "$1"`)
LF='
'
#
echo '<table>'
while IFS="$LF" read $READ_R record; do
    echo '<tr>'
    IFS=','
    set -- $record
    for col do
        echo "<td>$col</td>"
    done
    echo '</tr>'
done < "$1"
echo '</table>'

今回はBashでファイルを読み込んで処理する3通りの方法を紹介しました。

何かの参考になれば幸いです。