我在Bash中搜索了元字符列表,但是没有登记空间。
我想知道我是否正确假设空间是"令牌分离字符"在Bash中,因为它不仅可以与Shell程序或内置函数一起工作,而且在通过复合赋值创建数组时 - 引用转义空格,就像它们执行大多数其他元字符一样。
但是,它们不能被反斜杠转义。
例如,参数被传递给由空格分隔的程序和函数。
有人可以解释bash如何(以及何时)解释空格?谢谢!
我写了一个例子:
$ a=(zero one two)
$ echo ${a[0]}
$ zero
$ a=("zero one two")
$ echo ${a[0]}
$ zero one two
答案 0 :(得分:2)
从手册页:
metacharacter
A character that, when unquoted, separates words. One of the following:
| & ; ( ) < > space tab
^^^^^
答案 1 :(得分:2)
根据Token Recognition的Posix shell规范,任何shell(假装符合Posix)都应将空格解释为分隔标记:
如果当前字符是不带引号的<newline>
,则当前标记应分隔。
如果当前字符是不带引号的<blank>
,则包含前一个字符的任何标记都将被分隔,并且当前字符将被丢弃。
此处<blank>
是指shell启动时由LC_CTYPE
定义的字符类空白。几乎在所有情况下,该字符类都包含空格和制表符。
区分用于识别令牌的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
答案 2 :(得分:1)
是的。从Bash参考手册的Definitions部分:
空白
空格或制表符。
...
元字符
一个字符,当不加引号时,会分隔单词。元字符是空白或以下字符之一:“
|
”,“&
”,“;
”,“(
” ,“)
”,“<
”或“>
”。