
私はこの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つのスペースがあります)。34
78
- 各単語はグローバルパターンとして扱われ、ファイル名のリストに展開されます。。たとえば、
foo="*"; echo $foo
現在のディレクトリにあるファイルのリストを印刷します。
- 文字列はマロ。に表示されるすべての文字は、
他の多くのコンテキストと同様に、forループには単語のリストが必要です。だから
for x in $(foo); do …
これを単語に分割し、$(foo)
各単語をグローバルパターンとして扱います。IFS
デフォルト値は次のとおりです。スペース、タブ、改行したがって、foo
2行を印刷してから、およびを使用してhello world
ループhowdy
本文を実行します。改行のみを含めるように明示的に変更された場合とループが実行されます。に変更すると、、、(ここで改行文字)および に対してループが実行されます。x=hello
x=world
x=howdy
IFS
hello world
howdy
IFS
o
hell
w
rldh

wdy
答え2
IFS
- フィールドを区切る文字です。公開した例では newline() に設定されているため、設定するとテキストが 1 行ずつ処理されます。例では、(入力ファイルの特定の文字に)値を変更し、テキストがどのように分割されるかを確認できます。Input
Internal Field Separator
\n
for
IFS
しかし、投稿した回答で判断すると、2番目の解決策が推奨される解決策です。
〜のようにこんにちは気づいたInput
けどInternal
。名前Input
の由来には -awk
も含まれます。OFS
Output Field Separator
答え3
~からman bash
IFS 内部フィールド区切り文字は、拡張後の単語分割と読み込み組み込みコマンドを使用して行を単語に分割するために使用されます。デフォルトは「<space><tab><newline>」です。
これは Bash の内部変数の一つです。文字列を解釈するときにBashがフィールドまたは単語の境界を認識する方法を決定します。
デフォルトは空白(スペース、タブ、および改行)ですが、たとえばコンマ区切りのデータファイルを解析するために変更できます。
答え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スクリプトの他の部分が誤って破損するのを防ぎます。