情報を読み込み、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
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 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行目を読み込む処理が繰り返されてしまう。