このサイトの次のいくつかのスレッドとStackOverflowは、IFS
の方法を理解するのに役立ちました 作品:
- ループのコンテキストでのIFSとは何ですか?
- ファイルの行をループする方法
- Bash、IFSを使用して、ファイルから1行ずつ読み取ります
しかし、私はまだいくつかの短い質問があります。将来の読者の改善に役立つと思うので、同じ投稿で質問することにしました。
Q1。 IFS
通常、「フィールド分割」のコンテキストで説明されます。 フィールド分割ですか 単語分割と同じ ?
Q2: POSIX仕様には次のように書かれています:
IFSの値がnullの場合、フィールド分割は実行されません。
IFS=
を設定しています IFS
の設定と同じ nullに?これは、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
承認された回答:
- はい、同じです。
- はい。
- bashや同様のシェルでは、
IFS=$' tn'
のようなことを行うことができます。 。それ以外の場合は、[space] CTRL+V [tab] CTRL+V [enter]
を使用してリテラル制御コードを挿入できます。 。ただし、これを行うことを計画している場合は、別の変数を使用して古いIFS
を一時的に保存することをお勧めします。 値を入力し、後で復元します(または、var=foo command
を使用して1つのコマンドに対して一時的にオーバーライドします 構文)。 -
- 最初のコードスニペットは、読み取られた行全体を逐語的に
$line
に配置します。 、単語分割を実行するためのフィールド区切り文字がないため。ただし、多くのシェルは文字列を格納するためにcstringを使用するため、NULの最初のインスタンスによって、NULの外観が途中で終了する可能性があることに注意してください。 - 2番目のコードスニペットは、入力の正確なコピーを
$line
に配置しない場合があります 。たとえば、複数の連続するフィールドセパレータがある場合、それらは最初の要素の単一のインスタンスになります。これは、周囲の空白の喪失として認識されることがよくあります。 - 3番目のコードスニペットは2番目のコードスニペットと同じように機能しますが、スペース(通常のスペース、タブ、改行ではない)でのみ分割される点が異なります。
- 最初のコードスニペットは、読み取られた行全体を逐語的に