GNU/Linux >> Linux の 問題 >  >> Linux

Ifsを理解していますか?

このサイトの次のいくつかのスレッドと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

承認された回答:

  1. はい、同じです。
  2. はい。
  3. bashや同様のシェルでは、IFS=$' tn'のようなことを行うことができます。 。それ以外の場合は、[space] CTRL+V [tab] CTRL+V [enter]を使用してリテラル制御コードを挿入できます。 。ただし、これを行うことを計画している場合は、別の変数を使用して古いIFSを一時的に保存することをお勧めします。 値を入力し、後で復元します(または、var=foo commandを使用して1つのコマンドに対して一時的にオーバーライドします 構文)。
    • 最初のコードスニペットは、読み取られた行全体を逐語的に$lineに配置します。 、単語分割を実行するためのフィールド区切り文字がないため。ただし、多くのシェルは文字列を格納するためにcstringを使用するため、NULの最初のインスタンスによって、NULの外観が途中で終了する可能性があることに注意してください。
    • 2番目のコードスニペットは、入力の正確なコピーを$lineに配置しない場合があります 。たとえば、複数の連続するフィールドセパレータがある場合、それらは最初の要素の単一のインスタンスになります。これは、周囲の空白の喪失として認識されることがよくあります。
    • 3番目のコードスニペットは2番目のコードスニペットと同じように機能しますが、スペース(通常のスペース、タブ、改行ではない)でのみ分割される点が異なります。
関連:「IFS =read-rline」を理解していますか?
Linux
  1. Linuxでの起動時にsystemdを理解する

  2. MySQL 権限について

  3. tar:短い読み取り

  1. AnsibleのYAMLを理解する

  2. 「ifs=Read -rLine」を理解していますか?

  3. IPアドレスを逆方向に読み取る方法は?

  1. 「ifs」?

  2. `while Ifs =Read ..`で、なぜIfsは効果がないのですか?

  3. Linuxデスクトップを理解していますか?