「IFS」変数とは何ですか?

「IFS」変数とは何ですか?

私はこのQ&Aを読んでいます:ファイルの行を繰り返す方法は?

変数とは何ですかIFS? -loopsに関するその用途は何ですかfor

答え1

IFSこれはループと直接関係がなく、噴射に関連しています。IFSコマンド出力がループ反復のフラグメントに分割される方法を間接的に決定します。

$foo保護されていない変数置換またはコマンド置換がある場合は、次の$(foo)2つの状況があります。

  • "$foo"置換が二重引用符の間にある場合や変数の代入にある場合など、コンテキストに単一の単語が必要な場合は、置換のx=$foo結果として生成された文字列がそのまま使用されます。
  • コンテキストに複数の単語が必要な場合(ほとんどの場合)、結果文字列に対して2つの追加の拡張が行われます。
    • 文字列はマロ。に表示されるすべての文字は、$IFS単語区切り文字と見なされます。たとえば、IFS=":"; foo="12:34::78"; echo $foo印刷されます(12 34 ​ 78空白の単語があるため、間には2つのスペースがあります)。3478
    • 各単語はグローバルパターンとして扱われ、ファイル名のリストに展開されます。。たとえば、foo="*"; echo $foo現在のディレクトリにあるファイルのリストを印刷します。

他の多くのコンテキストと同様に、forループには単語のリストが必要です。だから

for x in $(foo); do …

これを単語に分割し、$(foo)各単語をグローバルパターンとして扱います。IFSデフォルト値は次のとおりです。スペース、タブ、改行したがって、foo2行を印刷してから、およびを使用してhello worldループhowdy本文を実行します。改行のみを含めるように明示的に変更された場合とループが実行されます。に変更すると、、、(ここで改行文字)および に対してループが実行されます。x=hellox=worldx=howdyIFShello worldhowdyIFSohell​ wrld​␤h​␤wdy

答え2

IFS- フィールドを区切る文字です。公開した例では newline() に設定されているため、設定するとテキストが 1 行ずつ処理されます。例では、(入力ファイルの特定の文字に)値を変更し、テキストがどのように分割されるかを確認できます。Input Internal Field Separator\nforIFS

しかし、投稿した回答で判断すると、2番目の解決策が推奨される解決策です。

〜のようにこんにちは気づいたInputけどInternal。名前Inputの由来には -awkも含まれます。OFSOutput Field Separator

答え3

~からman bash

IFS 内部フィールド区切り文字は、拡張後の単語分割と読み込み組み込みコマンドを使用して行を単語に分割するために使用されます。デフォルトは「<space><tab><newline>」です。

これは Bash の内部変数の一つです。文字列を解釈するときにBashがフィールドまたは単語の境界を認識する方法を決定します。

デフォルトは空白(スペース、タブ、および改行)ですが、たとえばコンマ区切りのデータファイルを解析するために変更できます。

http://tldp.org/LDP/abs/html/internalvariables.html

答え4

優れた以前の回答に加えて、以下を追加したいと思います。IFS効率的でポータブルな解析のための簡単なケースで便利です。置く。サブシェルやビルドツール(grepやsedなど)を使用しないため、効率的です。

resolutions="640x480,320x240"
xIFS=$IFS
IFS=','
for res in $resolutions; do
    xxIFS=$IFS
    IFS='x'
    set -- $res
    width=$1
    height=$2
    # handle width and height
    IFS=$xxIFS
done;
IFS=$xIFS

以前の値を保存して復元する必要があります。IFSスクリプトの他の部分が誤って破損するのを防ぎます。

関連情報