我想知道IFS如何影响bash中的分词。行为是依赖于上下文的,这种方式看起来不符合分词的直觉。如何在bash中控制IFS分词
一般想法似乎很简单。从bash手册页引用:
shell将IFS的每个字符视为分隔符,并将其他扩展的结果拆分为这些字符上的单词。 ...请注意,如果不发生扩展,则不会执行分割。
这可以通过将IFS变量设置为','并使用逗号分隔参数列表调用shell函数来轻松验证。
echo_n() {
echo Num args: $#, Args: "[email protected]"
}
(IFS=','
args=foo,bar,baz
echo_n $args
)
正如预期的那样,这导致在三个不同的参数echo_n
Num args: 3, Args: foo bar baz
调用echo_n直接用逗号分隔的列表,因为没有扩展触发失败。
IFS=, echo_n foo,bar,baz
结果
Num args: 1, Args: foo,bar,baz
到这里事情似乎相当扭曲的,但我可以换我的头周围。当我们开始为图片添加循环时,事情会变得更加复杂。
(IFS=,; for i in foo,bar,baz ; do echo_n $i; done)
导致
Num args: 3, Args: foo bar baz
这违背的目的for循环。
现在,我可以通过强制某种形式的扩展触发的任何几个bash技巧强制IFS词分裂。例如:
(IFS=,; for i in ${NO_VAR:-foo,bar,baz} ; do echo_n $i; done)
导致
Num args: 1, Args: foo
Num args: 1, Args: bar
Num args: 1, Args: baz
(诀窍在于具有缺省值评估未定义的变量NO_VAR。)
另一个类似的特技,依靠命令替换:
(IFS=,; for i in $(echo foo,bar,baz) ; do echo_n $i; done)
所以,这里的问题是:什么是推荐的,惯用的方式t o是否控制执行IFS分词的上下文?