(bash)シェルスクリプトでファイルを読み込む
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通りの方法を紹介しました。
何かの参考になれば幸いです。