「IFS」とは何ですか?


回答:


17

IFSを表します-フィールドを区切る文字です。投稿した例では、改行文字()に設定されています。設定した後、テキストを1行ずつ処理します。その例では、(入力ファイルにある文字に)の値を変更し、テキストの分割方法を確認できます。Input Internal Field Separator\nforIFS

ところで、あなたが投稿した答えから、2番目の解決策はお勧めです...

@jasonwryan注目、そうではありませんInputけどInternal。名前のInput由来awkOFS- もありOutput Field Separatorます。


1
IFSは、出力用のパラメーターの組み合わせにも使用されることに注意してください。bashのマニュアルページから:「展開が二重引用符で囲まれている場合、IFS特殊変数の最初の文字で区切られた各パラメーターの値を持つ単一の単語に展開されます。」
エリック

また、while Sは、元のBourneシェルのセパレーターであったことに注意してください。Kornシェルおよび他のほとんどのボーンのようなものが、今で指定されているようにシェルでPOSIXS(ちょうどあなたの想像力少し伸ばす)として区切りのためであるA::B:「インスタンスのための分割は、「A」にある」と「B」(余分「」)。それは異なるだawkFSsのパラメータ展開フラグzsh
ステファンシャゼラス

27

IFSループに直接関連するのではなく、単語の分割に関連します。IFSコマンドからの出力を、ループが反復する部分に分割する方法を間接的に決定します。

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

  • コンテキストが単一の単語を想定している場合、たとえば、置換が二重引用符の間"$foo"にある場合、または変数の割り当てのx=$foo場合、置換の結果の文字列がそのまま使用されます。
  • コンテキストが複数の単語を予期している場合(ほとんどの場合)、結果の文字列に対してさらに2つの展開が実行されます。
    • 文字列は単語に分割されます。に表示されるすべての文字$IFSは、単語の区切りと見なされます。たとえば、IFS=":"; foo="12:34::78"; echo $foo印刷します12 34 ​ 78(空の単語があるため、34との間にスペースが2つあります78)。
    • 各単語は、globパターンとして扱われ、ファイル名のリストに展開されます。たとえばfoo="*"; echo $foo、現在のディレクトリ内のファイルのリストを印刷します。

Forループは、他の多くのコンテキストと同様に、単語のリストを想定しています。そう

for x in $(foo); do 

$(foo)単語に分割し、各単語をグロブパターンとして扱います。のデフォルト値IFSspace、tab、newlineであるため、foo2行hello worldを出力しhowdy、ループ本体がx=hello、次にx=world、で実行されx=howdyます。場合はIFS、明示的にのみ、改行を含むように変更され、その後、ループが実行されるhello worldhowdy。場合IFSに変更されo、その後、ループが実行されるhell​ wrld​␤h(ここで、​␤改行文字である)とwdy


なぜ「間接的に」と"IFS indirectly determines how ..."言ったのですか?
αғsнιη

1
@αғsнιηはIFS(直接)コマンド置換の出力を分割する方法を決定し、その後(間接的に)ループがループするものを決定します。
ジル 'SO-悪であるのをやめる'

5

から man bash

IFS展開後の単語分割、およびread組み込みコマンドで行を単語に分割するために使用される内部フィールド区切り文字。デフォルト値は「<space> <tab> <newline>」です。

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

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

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


0

これまでのすばらしい答えに加えて、IFSsetと組み合わせて簡単なケースで効率的でポータブルな解析に非常に役立つことを付け加えておきます。効率的。サブシェルや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の以前の値を保存および回復する必要があることに注意してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.