このサイトの次のいくつかのスレッドと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番目のコードスニペットと同じように機能しますが、スペース(通常のスペース、タブ、改行ではない)でのみ分割される点が異なります。
- 最初のコードスニペットは、読み取られた行全体を逐語的に