シェルスクリプト :: read コマンド

情報を読み込み、1つまたは複数の変数に値をセットする

例えば、下記のようなテキストファイル「profile.txt」があるとします。
1行1レコードで情報の内容は、名前, 性別, 生年月日, 血液型 となっています。

% less profile.txt 
taro,male,1980-05-06,O
hanako,female,1982-03-14,A
hiroshi,male,1981-06-17,AB
emi,female,1982-12-03,B

read コマンドで情報を読み込み、変数に代入する

while IFS=, read name sex birthday blood_type
do
echo $name
echo $sex
echo $birthday
echo $blood_type
echo ''
done < profile.txt

taro
male
1980-05-06
O

hanako
female
1982-03-14
A

hiroshi
male
1981-06-17
AB

loop の末行でリダイレクトしているが、これが正しい記述です。
IFS はフィールドの区切り文字を指定しています。



less コマンドの出力をパイプに渡す

less profile.txt |
while IFS=, read name sex birthday blood_type
do
echo $name
echo $sex
echo $birthday
echo $blood_type
echo ''
done

taro
male
1980-05-06
O

hanako
female
1982-03-14
A

hiroshi
male
1981-06-17
AB

読みやすくはなるが、less コマンドの呼び出しオーバヘッドにより、若干速度が低下する。



無限ループ (誤った記述)

while IFS=, read name sex birthday blood_type < profile.txt
do
echo $name
echo $sex
echo $birthday
echo $blood_type
echo ''
done

taro
male
1980-05-06
O

taro
male
1980-05-06
O

taro
male
1980-05-06
O

 :
 :
 :

ループのたびに、profile.txt がオープンされ、その1行目を読み込む処理が繰り返されてしまう。