105.2標準
標準入力を1行ずつ読み、先頭末尾の空白とバックスラッシュを解釈せず保持する。
適切なwhile条件はどれか。
× 不正解
IFS= read -rは行の周辺空白とバックスラッシュを保持する定番形である。ループ内でも"$line"と引用する。
詳細解説
正しい
while IFS= read -r line; do process "$line"; doneIFSを空にし、-rでバックスラッシュ処理を無効にして各行を読む。
正しい。IFS=が先頭末尾のIFS文字除去を抑え、read -rがバックスラッシュを通常文字として保持する。
誤り
while read line; do process $line; done空白の除去やバックスラッシュ解釈が起こり、未引用展開も行境界を壊し得る。
誤り。readの既定処理と未引用の$lineにより、空白、バックスラッシュ、glob文字を含む行を元のまま渡せない。
誤り
for line in $(cat); do process "$line"; doneコマンド置換後の単語分割により行ではなく語ごとに反復する。
誤り。$(cat)の結果は改行だけでなくIFSの空白全般で分割され、1行が複数のループ項目になり得る。
誤り
read -a line | while line; do process; done配列読込とパイプを誤用し、lineを条件コマンドとして実行しようとする。
誤り。read -aは語を配列へ格納するBash機能であり、パイプ後のwhile lineは変数値をコマンド名として実行しようとする。
実際に確かめる
一時的な検証環境で実行できる例です。
printf ' a\\b \n' | while IFS= read -r line; do printf '<%s>\n' "$line"; done期待される結果
< a\b >理解のポイント
- IFS=で周辺空白を保持
- read -rで\を保持
- 展開時も引用
確認時の注意
- 確認環境: GNU Bash 5.2 / 標準入力
基礎のおさらい
readの終了状態
readは1行を正常に取得すると0、EOF等で非0となるため、そのままwhileの反復条件に使える。
末尾改行なし
最終行に改行がない入力も処理する場合はwhile IFS= read -r line || [ -n "$line" ]の形を検討する。
問題IDKP-105-630
確認環境GNU Bash 5.2 / 標準入力
最終技術確認2026-08-13
誤り・権利侵害を報告