1.06.2標準
標準入力を末尾まで1行ずつ変数lineへ読み、バックスラッシュをそのまま保持する。
先頭や末尾の空白も保持する。
適切なループ開始行はどれか。
× 不正解
while IFS= read -r line; do ...; doneは空白とバックスラッシュを保ちながら入力を1行ずつ処理する定型である。
詳細解説
誤り
for line in read; doreadの入力行を反復する構文ではない。
forはreadコマンドの標準入力を行単位で取得しない。lineには固定語readが入るだけである。
誤り
while read line; do行は読めるがIFS処理とバックスラッシュ解釈により内容を変える場合がある。
while read lineでも行は反復できるが、既定IFSにより先頭末尾の空白を除去し、バックスラッシュをエスケープとして解釈する場合がある。
正しい
while IFS= read -r line; do空白の分割・除去とバックスラッシュ解釈を抑えて1行ずつ読む。
IFS=で空白分割・除去を抑え、read -rでバックスラッシュを文字どおり読む。readがEOFで失敗するとwhileが終了する。
誤り
if IFS= read -r line; then1行の条件分岐で、EOFまで繰り返すループではない。
ifはreadを1回だけ実行してthenへ分岐する。入力の全行を処理するにはwhileによる反復が必要である。
実際に確かめる
一時的な検証環境で実行できる例です。
printf ' a\\b \n' | while IFS= read -r line; do printf '<%s>\n' "$line"; done期待される結果
< a\b >理解のポイント
- IFS=で空白を保持
- read -rでバックスラッシュ保持
- EOFでreadが失敗し終了
確認時の注意
- 確認環境: POSIX sh / パイプ入力
- 末尾に改行がない最終行も処理する場合はread失敗時の部分入力を考慮した条件を追加する。
基礎のおさらい
IFS=
readコマンドだけに空のIFSを与え、行の先頭・末尾にあるIFS空白を保持する。
read -r
バックスラッシュをエスケープとして扱わず、入力文字として保持する。
問題IDKL-102-923
確認環境POSIX sh / パイプ入力
最終技術確認2026-08-13
誤り・権利侵害を報告