space 是否被视为 Bash 中的元字符?

Is space considered a metacharacter in Bash?

我已经在 Bash 中搜索了元字符列表,但未列出 space。 我想知道我假设 space 是 Bash 中的 "token separation character" 是否正确,因为它不仅适用于 Shell 程序或内置程序,而且在创建通过复合赋值的数组 - 引号转义 spaces,就像它们对大多数其他元字符所做的一样。 但是,它们不能被反斜杠转义。
例如,参数被传递给由 space 分隔的程序和函数。 有人可以解释 bash 如何(以及何时)解释 spaces 吗?谢谢!
我写了一个例子:

$ a=(zero one two)

$ echo ${a[0]}

$ 零

$ a=("zero one two")

$ echo ${a[0]}

$零一二

来自手册页:

metacharacter
      A character that, when unquoted, separates words.  One of the following:
      |  & ; ( ) < > space tab
                     ^^^^^

是的。来自 Bash 参考手册的 Definitions 部分:

blank

A space or tab character.

metacharacter

A character that, when unquoted, separates words. A metacharacter is a blank or one of the following characters: ‘|’, ‘&’, ‘;’, ‘(’, ‘)’, ‘<’, or ‘>’.

根据 Token Recognition 的 Posix shell 规范,任何 shell(伪装成 Posix 兼容的)都应该解释为 whitespace 作为分隔符:

  1. 如果当前字符是不带引号的 <newline>,则当前标记应被分隔。

  2. 如果当前字符是未加引号的<blank>,任何包含前一个字符的标记都将被分隔,当前字符将被丢弃。

这里的<blank>指的是字符class 空白,在shell开始时由LC_CTYPE定义。在几乎所有情况下,字符 class 恰好由 space 和制表符组成。

区分用于识别标记的 shell 机制和使用 $IFS 执行分词很重要。在大括号、波浪号、参数和变量、算术和命令扩展之后执行分词(在大多数情况下)。考虑一下,例如:

$ # Setting IFS does not affect token recognition
$ bash -c 'IFS=:; arr=(foo:bar); echo "${arr[0]}"'
foo:bar
$ # But it does affect word splitting after variable expansion
$ bash -c 'IFS=: foobar=foo:bar; arr=($foobar); echo "${arr[0]}"'
foo