IFS
以下は、このサイトとStackOverflowのしくみを理解するのに役立ついくつかのトピックです。
しかし、いくつかの簡単な質問があります。私はそれが将来の読者にとってより良い助けになると思ったので、同じ記事で彼らに尋ねることにしました。
Q1. IFS
一般に、「フィールド分割」という文脈で議論されている。はいフィールド分割そして噴射?
質問2:POSIX仕様説明する:
IFS 値が空の場合、フィールド分割は行われません。
IFS=
nullに設定するのと同じように設定していますかIFS
?これが意味する設定ですかempty string
?
Q3:POSIX仕様では読む次のように:
IFSが設定されていない場合、シェルはIFS値が次のように機能します。
<space>, <tab> and <newline>
デフォルト値を復元したいとしますIFS
。どうすればいいですか? (より具体的には、<tab>
どうやって参照しますか<newline>
?)
Q4:最後に、このコードの仕組みは次のとおりです。
while IFS= read -r line
do
echo $line
done < /path_to_text_file
最初の行を次のように変更すると、
while read -r line # Use the default IFS value
または:
while IFS=' ' read -r line
ベストアンサー1
- はい、同じです。
- はい。
- bashと同様のシェルでも同様のことができます
IFS=$' \t\n'
。それ以外の場合は、テキスト制御コードの挿入を使用できます[space] CTRL+V [tab] CTRL+V [enter]
。ただし、これを行う予定の場合は、別の変数を使用して以前の値IFS
を一時的に保存してから後で復元することをお勧めします(または1つのコマンドで以前の値を一時的に上書きする構文を使用することvar=foo command
)。 -
$line
最初のコードスニペットは、単語の区切りを実行するフィールド区切り文字がないため、読み取った行全体をそのまま表示します。ただし、多くのシェルが文字列を格納するためにcstringを使用しているため、NULの最初のインスタンスがまだ早期に終了する可能性があることに注意してください。- 2番目のスニペットは、入力の正確なコピーを挿入できない場合があります
$line
。たとえば、連続するフィールド区切り文字が複数ある場合、最初の要素の単一インスタンスとして作成されます。これは通常、周囲のスペースの損失と見なされます。 - 3番目のスニペットは、スペース(通常のスペース、タブ、または改行ではない)に分割されていることを除いて、2番目と同じことを行います。