Bash の読み取りでは先頭のスペースが無視されます 質問する

Bash の読み取りでは先頭のスペースが無視されます 質問する

a.txt以下の内容のファイルがあります

    aaa
    bbb

次のスクリプトを実行すると:

while read line
do
    echo $line
done < a.txt > b.txt

生成されたb.txt内容は次の通りです

aaa
bbb

行の先頭のスペースが削除されているようです。先頭のスペースを保持するにはどうすればよいでしょうか?

ベストアンサー1

これについては、Bash FAQのエントリで説明されています。データを行ごとに読み取る

read コマンドは読み取られた各行を変更します。デフォルトでは、先頭と末尾の空白文字 (スペースとタブ、または IFS に存在する空白文字) がすべて削除されます。これが望ましくない場合は、IFS 変数をクリアする必要があります。

# Exact lines, no trimming
while IFS= read -r line; do
  printf '%s\n' "$line"
done < "$file"

Charles Duffy が正しく指摘しているように (そして私はそのIFS問題に集中していたため見逃していました)、出力内のスペースを表示したい場合は、変数を使用するときにも引用符で囲む必要があります。そうしないと、シェルは再び空白を削除します。

引用されたスニペットと元のコードを比較した場合のその他のいくつかの違いについてのメモ。

引数の使用について-rは、read前にリンクしたページの上部にある 1 つの文で説明されています。

read の -r オプションは、バックスラッシュの解釈を防止します (通常、バックスラッシュと改行のペアとして使用され、複数の行にまたがります)。このオプションを指定しないと、入力内のバックスラッシュは破棄されます。read では、ほとんどの場合、-r オプションを使用する必要があります。

printfthereの代わりにを使用する場合、echoの動作はecho、残念ながら、すべての環境にわたって移植性のある一貫性がなく、違いに対処するのが面倒になる可能性があります。printf一方、 は一貫性があり、完全に堅牢に使用できます。

おすすめ記事