私はこのスレッドを読んでいました:ファイルの行をループする方法は?
なにIFS?そして、for-loopsのコンテキストでの使用法は何ですか?
私はこのスレッドを読んでいました:ファイルの行をループする方法は?
なにIFS?そして、for-loopsのコンテキストでの使用法は何ですか?
回答:
IFSを表します-フィールドを区切る文字です。投稿した例では、改行文字()に設定されています。設定した後、テキストを1行ずつ処理します。その例では、(入力ファイルにある文字に)の値を変更し、テキストの分割方法を確認できます。InputInternal Field Separator\nforIFS
ところで、あなたが投稿した答えから、2番目の解決策はお勧めです...
@jasonwryan注目、そうではありませんInputけどInternal。名前のInput由来awkはOFS- もありOutput Field Separatorます。
Sは、元のBourneシェルのセパレーターであったことに注意してください。Kornシェルおよび他のほとんどのボーンのようなものが、今で指定されているようにシェルでPOSIX、S(ちょうどあなたの想像力少し伸ばす)として区切りのためであるA::B:「インスタンスのための分割は、「A」にある」と「B」(余分「」)。それは異なるだawkのFSかsのパラメータ展開フラグzsh。
IFSループに直接関連するのではなく、単語の分割に関連します。IFSコマンドからの出力を、ループが反復する部分に分割する方法を間接的に決定します。
保護されていない変数の置換$fooまたはコマンドの置換$(foo)がある場合、2つのケースがあります。
"$foo"にある場合、または変数の割り当てのx=$foo場合、置換の結果の文字列がそのまま使用されます。$IFSは、単語の区切りと見なされます。たとえば、IFS=":"; foo="12:34::78"; echo $foo印刷します12 34 78(空の単語があるため、34との間にスペースが2つあります78)。foo="*"; echo $foo、現在のディレクトリ内のファイルのリストを印刷します。Forループは、他の多くのコンテキストと同様に、単語のリストを想定しています。そう
for x in $(foo); do …
$(foo)単語に分割し、各単語をグロブパターンとして扱います。のデフォルト値IFSはspace、tab、newlineであるため、foo2行hello worldを出力しhowdy、ループ本体がx=hello、次にx=world、で実行されx=howdyます。場合はIFS、明示的にのみ、改行を含むように変更され、その後、ループが実行されるhello worldとhowdy。場合IFSに変更されo、その後、ループが実行されるhell、 w、rldh(ここで、改行文字である)とwdy。
"IFS indirectly determines how ..."言ったのですか?
IFS(直接)コマンド置換の出力を分割する方法を決定し、その後(間接的に)ループがループするものを決定します。
から man bash
IFS展開後の単語分割、およびread組み込みコマンドで行を単語に分割するために使用される内部フィールド区切り文字。デフォルト値は「<space> <tab> <newline>」です。
これは、Bashの内部変数の1つです。Bashが文字列を解釈するときに、フィールドまたは単語の境界を認識する方法を決定します。
デフォルトは空白(スペース、タブ、改行)ですが、たとえば、コンマ区切りのデータファイルを解析するために変更される場合があります。
これまでのすばらしい答えに加えて、IFSはsetと組み合わせて簡単なケースで効率的でポータブルな解析に非常に役立つことを付け加えておきます。効率的。サブシェルや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の以前の値を保存および回復する必要があることに注意してください。