除了读取 shell 内置功能之外,IFS 还用于其他用途吗?

除了读取 shell 内置功能之外,IFS 还用于其他用途吗?

每当我读到有关 IFS 的内容时,它总是处于read(或者至少我是这样理解的)上下文中。

read除了shell 内置之外,IFS 还用于其他用途吗?

答案1

POSIX shell 手册对字段拆分有以下说明:

2.6.5 字段分割

在参数扩展(Parameter Expansion)、命令替换(Command Substitution)和算术扩展(Arithmetic Expansion)之后,shell会扫描双引号中未发生的扩展和替换的结果,以进行字段分割,并且可能会产生多个字段。

shell 应将 IFS 的每个字符视为分隔符,并使用分隔符作为字段终止符,将参数扩展、命令替换和算术扩展的结果拆分为字段。

如果 IFS 的值为<space><tab>、 和<newline>,或者如果未设置,则输入开头或结尾处的任何<space><tab>、 或字符序列都将被忽略,并且输入中这些字符的任何序列都将定界字段。<newline>例如,输入:

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

产生两个字段,foo 和 bar。

如果IFS的值为空,则不进行字段分割。

否则,依次适用以下规则。术语“IFS 空白”用于表示 IFS 值中的空白字符的任何序列(零个或多个实例)(例如,如果 IFS 包含<space>/ <comma>/ <tab>,则<space><tab>字符的任何序列都被视为 IFS 空白)。

输入开头和结尾的 IFS 空白应被忽略。

输入中每次出现的不是 IFS 空白的 IFS 字符以及任何相邻的 IFS 空白都应界定一个字段,如前所述。

非零长度 IFS 空白应界定字段。

因此,每当 shell 扩展未加引号的参数、命令替换或算术扩展时,它都会根据 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
$

相关内容