IFS 中的空白与 IFS 中的非空白之间的行为差异
Difference in behaviour between whitespace in IFS vs. non-whitespace in IFS
我知道 read
命令按 IFS 中的字符拆分输入。因此,如果我将 IFS 设置为 space,则 read
命令的输入将使用 space 作为分隔符进行拆分。如下所示。
[lone@centos ~]$ IFS=" "
[lone@centos ~]$ read a b c
foo bar baz qux
[lone@centos ~]$ echo "$a"
foo
[lone@centos ~]$ echo "$b"
bar
[lone@centos ~]$ echo "$c"
baz qux
我原以为如果我将 IFS 更改为非白色 space 字符,例如冒号并在我的输入中使用冒号作为分隔符,则行为应该没有变化。但事实证明这是错误的。例如,在下面的输出中,echo "$a"
是空白的。为什么?
[lone@centos ~]$ IFS=:
[lone@centos ~]$ read a b c
:foo:bar:baz:qux
[lone@centos ~]$ echo "$a"
[lone@centos ~]$ echo "$b"
foo
[lone@centos ~]$ echo "$c"
bar:baz:qux
[lone@centos ~]# echo $c
bar baz qux
为什么 echo $c
的输出不包含冒号?
问题 1:在下面的输出中,echo "$a"
是空白的。为什么?
因为空格在 POSIX 中定义是特殊的 (2.6.5 Field Splitting
):
3a. IFS white space shall be ignored at the beginning and end of the input.
问题 2:为什么 echo $c
的输出不包含冒号?
因为bash
按照IFS
进行分词(还是设置为:
)before传递bar
、baz
和 qux
作为 echo
.
的单独参数
我知道 read
命令按 IFS 中的字符拆分输入。因此,如果我将 IFS 设置为 space,则 read
命令的输入将使用 space 作为分隔符进行拆分。如下所示。
[lone@centos ~]$ IFS=" "
[lone@centos ~]$ read a b c
foo bar baz qux
[lone@centos ~]$ echo "$a"
foo
[lone@centos ~]$ echo "$b"
bar
[lone@centos ~]$ echo "$c"
baz qux
我原以为如果我将 IFS 更改为非白色 space 字符,例如冒号并在我的输入中使用冒号作为分隔符,则行为应该没有变化。但事实证明这是错误的。例如,在下面的输出中,echo "$a"
是空白的。为什么?
[lone@centos ~]$ IFS=:
[lone@centos ~]$ read a b c
:foo:bar:baz:qux
[lone@centos ~]$ echo "$a"
[lone@centos ~]$ echo "$b"
foo
[lone@centos ~]$ echo "$c"
bar:baz:qux
[lone@centos ~]# echo $c
bar baz qux
为什么 echo $c
的输出不包含冒号?
问题 1:在下面的输出中,echo "$a"
是空白的。为什么?
因为空格在 POSIX 中定义是特殊的 (2.6.5 Field Splitting
):
3a. IFS white space shall be ignored at the beginning and end of the input.
问题 2:为什么 echo $c
的输出不包含冒号?
因为bash
按照IFS
进行分词(还是设置为:
)before传递bar
、baz
和 qux
作为 echo
.