Bash中的单词拆分,IFS设置为非空白字符

时间:2017-04-01 23:54:10

标签: bash split variable-expansion ifs

我正在浏览Bash tutorial,特别是分词的主题。

这个名为“args”的脚本有助于演示分词示例:

#!/usr/bin/env bash
printf "%d args:" $#
printf " <%s>" "$@"
echo

一个例子:

$ ./args hello world, here is "a string of text!"
5 args: <hello> <world,> <here> <is> <a string of text!>

到目前为止一切顺利。我理解这是如何运作的。

但是,当我用非空格字符替换IFS时,比如说:,如果我直接将字符串作为参数传递,脚本就不会执行分词。

$ ./args one:two:three
1 args: <one:two:three>

但是,如果I(1)将字符串分配给变量,然后(2)通过参数扩展将字符串传递给脚本,则脚本 对同一字符串执行分词。< / p>

$ IFS=:
$ variable="one:two:three"
$ ./args $variable
3 args: <one> <two> <three>

为什么呢?具体来说,为什么传递字符串作为参数在IFS未设置且分隔符是空格字符时会进行分词,但是当IFS设置为非空白字符时却不会?

当我使用read代替此脚本时,相同的字符串也会按预期进行分词。

$ IFS=:
$ read a b c
one:two:three
$ echo $a $b $c
one two three

1 个答案:

答案 0 :(得分:9)

您可以阅读有关分词here的更多信息。

  

shell扫描参数扩展,命令替换的结果,   用于分词的双引号内没有出现的算术扩展。

当您将裸字符串one:two:three作为参数传递且IFS设置为:时,Bash不执行分词,因为裸字符串不是参数之一扩展,命令替换或算术扩展上下文。

但是,当为变量分配相同的字符串并且将变量传递给不加引号的脚本时,会发生单词拆分,因为它是参数扩展的情况。

同样适用于这些(命令替换):

$ ./args $(echo one:two:three)
3 args: <one> <two> <three>

$ ./args "$(echo one:two:three)"
1 args: <one:two:three>

作为documentedread命令会在每行读取时进行分词,除非IFS已设置为空字符串。