空间被认为是Bash中的元字符吗?

时间:2015-08-24 15:38:34

标签: linux bash shell escaping character

我在Bash中搜索了元字符列表,但是没有登记空间。 我想知道我是否正确假设空间是"令牌分离字符"在Bash中,因为它不仅可以与Shell程序或内置函数一起工作,而且在通过复合赋值创建数组时 - 引用转义空格,就像它们执行大多数其他元字符一样。 但是,它们不能被反斜杠转义。
例如,参数被传递给由空格分隔的程序和函数。 有人可以解释bash如何(以及何时)解释空格?谢谢!
我写了一个例子:

$ a=(zero one two)

$ echo ${a[0]}

$ zero

$ a=("zero one two")

$ echo ${a[0]}

$ zero one two

3 个答案:

答案 0 :(得分:2)

从手册页:

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

答案 1 :(得分:2)

根据Token Recognition的Posix shell规范,任何shell(假装符合Posix)都应将空格解释为分隔标记:

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

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

  3. 此处<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部分:

  

空白

     

空格或制表符。

     

...

     

元字符

     

一个字符,当不加引号时,会分隔单词。元字符是空白或以下字符之一:“|”,“&”,“;”,“(” ,“)”,“<”或“>”。