Nad*_*ami 7 bash split variable-expansion ifs
我正在阅读Bash 教程,特别是单词分裂的主题.
这个名为"args"的脚本有助于演示单词拆分示例:
#!/usr/bin/env bash
printf "%d args:" $#
printf " <%s>" "$@"
echo
Run Code Online (Sandbox Code Playgroud)
一个例子:
$ ./args hello world, here is "a string of text!"
5 args: <hello> <world,> <here> <is> <a string of text!>
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.我理解这是如何工作的.
但是,当我用非空白字符替换IFS时,:
如果我直接将字符串作为参数传递,则脚本不会执行分词.
$ ./args one:two:three
1 args: <one:two:three>
Run Code Online (Sandbox Code Playgroud)
但是,如果I(1)将字符串分配给变量,然后(2)通过参数扩展将字符串传递给脚本,则脚本会对同一字符串执行分词.
$ IFS=:
$ variable="one:two:three"
$ ./args $variable
3 args: <one> <two> <three>
Run Code Online (Sandbox Code Playgroud)
为什么?具体来说,当IFS未设置且分隔符是空白字符时,为什么传递字符串作为参数会进行单词拆分,但是当IFS设置为非空白字符时却不会?
当我使用read
而不是这个脚本时,相同的字符串也会按预期进行单词拆分.
$ IFS=:
$ read a b c
one:two:three
$ echo $a $b $c
one two three
Run Code Online (Sandbox Code Playgroud)
您可以在此处阅读有关单词拆分的更多信息.
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>
Run Code Online (Sandbox Code Playgroud)
如文档所述,read
除非IFS已设置为空字符串,否则命令会对每行读取执行单词拆分.