【发布时间】:2017-08-27 01:20:55
【问题描述】:
我正在经历 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>
但是,如果我 (1) 将字符串分配给变量,然后 (2) 通过参数扩展将字符串传递给脚本,则脚本会对同一字符串执行分词。
$ 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
【问题讨论】:
标签: bash shell syntax ifs variable-expansion