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 作为分隔符:
如果当前字符是不带引号的 <newline>
,则当前标记应被分隔。
如果当前字符是未加引号的<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
我已经在 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 作为分隔符:
如果当前字符是不带引号的
<newline>
,则当前标记应被分隔。如果当前字符是未加引号的
<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