我正在学习一个关于Bash的教程, 主要学习单词分割的内容。
这个叫做"args"的脚本,有助于演示单词分割的例子:
一个例子:
到目前为止还不错,我明白这是如何工作的。
然而,当我使用非空格字符(比如
为什么当IFS未设置且分隔符是空格字符时,将字符串作为参数传递时会进行单词拆分,但是当IFS设置为非空格字符时不会进行单词拆分?为什么使用
这个叫做"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
:)
- David C. Rankin./args hello world, here is "a string of text!"
时,为什么这个脚本中仍然会触发单词拆分呢?我在那里没有明确执行参数扩展,但是进行了单词拆分,这意味着某些东西触发了扩展。 - Nadim Hussamiread
命令确实会在读取每行时进行单词拆分,除非IFS已设置为空字符串”时,你基本上已经这么说了。似乎printf做事情的方式不同。 - Nadim Hussami