IFSは、シェル組み込み読み取り以外の目的で使用されますか? [コピー]

IFSは、シェル組み込み読み取り以外の目的で使用されますか? [コピー]

IFSについて読むたびに常に文脈がありますread(または少なくとも私が理解する方法はそうです)。

readIFSはシェル組み込み以外の用途に使用されますか?

答え1

POSIX シェルマニュアルには、フィールドの分割に関する次のガイドラインがあります。

2.6.5 フィールド分割

パラメータ拡張(Parameter Expansion)、コマンド置換(Command Substitution)、算術拡張(Arithmetic Expansion)の後、シェルはフィールド分割のために二重引用符で囲まれていない拡張および置換結果をスキャンして複数のフィールドを生成できます。

シェルはIFSの各文字を区切り文字として扱い、区切り文字をフィールド終端として使用して、パラメータ拡張、コマンド置換、および算術拡張の結果をフィールドに分割する必要があります。

IFS値が<space>、、、、<tab>または設定されていない場合、<newline>入力の先頭または末尾にある、または文字<space>のシーケンス<tab>は無視され、入力内のこれらの文字のシーケンスはフィールドを区切ります。<newline>たとえば、次のように入力します。

<newline><space><tab>foo<tab><tab>bar<space>

fooとbarという2つのフィールドを作成します。

IFS 値が空の場合、フィールド分割は行われません。

それ以外の場合は、次の規則が順番に適用されます。 「IFS スペース」という用語は、IFS 値の空白文字のシーケンス (0 個以上のインスタンス) を意味するために使用されます。たとえば、IFSに<space>/ <comma>/が<tab>含まれている場合<space>、および文字の<tab>シーケンスはIFSスペースと見なされます。

入力の始まりと終わりのIFSスペースは無視する必要があります。

入力でIFSスペースではなくIFS文字に隣接するIFSスペースが発生するたびに、上記のようにフィールドを区切る必要があります。

長さゼロ以外のIFSスペースはフィールドを区切る必要があります。

そのため、シェルが引用符で囲まれていない引数、コマンド置換、または算術拡張を拡張するたびに、IFSの設定方法に従って結果をフィールドに分割します。

これにより、パラメータ拡張の文脈でこれを確認できます。

$ IFS=$' \t\n'
$ var='foo:bar'
$ printf '<%s>\n' $var
<foo:bar>
$ IFS=:
$ printf '<%s>\n' $var
<foo>
<bar>
$ printf '<%s>\n' "$var"
<foo:bar>
$ set -- foo bar baz
$ echo "$*"
foo:bar:baz
$ IFS=$' \t\n'
$ echo "$*"
foo bar baz
$

関連情報