2013-09-26 49 views
1

作爲初學者,我沒有在任何地方找到答案,關於間距(語法)和解析的規則。方括號中的殼間距

例如。

我可以做

if [$# -eq 2] ; 
then 
    llll 
fi 

或我必須總是有對象之間的空白或兩個,作爲

if [ $# -eq 2 ] ; 
then 
    llll 
fi 

和第二相關的問題是關於

if [[ $# -eq 2 ]] ; 
then 
wafwaf 
fi 
之間的區別

我所關心的是關於[,之前/之後的間距。

沒有搜索爲我提供了一套規則。

+0

的一個好辦法知道什麼是合法的命令語法,什麼是不是嘗試它。 – Neil

回答

5

[之後和]之前需要空格。

  1. [實際上是一個命令的名稱,對於test的別名。這不是一個特殊的符號,它只是一個名字不尋常的命令。

    $ help '[' 
    [: [ arg... ] 
        Evaluate conditional expression. 
    
        This is a synonym for the "test" builtin, but the last argument must 
        be a literal `]', to match the opening `['. 
    
  2. 因爲它是一個普通的命令名稱,而不是一個特殊字符,一個空間的[後需要。如果您省略空間並編寫[foo,那麼shell將搜索$PATH以獲得名爲[foo的命令。

    $ [ foo = foo ] && echo true 
    true 
    $ [foo = foo] && echo true 
    [foo: command not found 
    
  3. 爲了增強可讀性的緣故,[預計其最後一個參數是完全]。作爲一個普通的命令行參數,]必須在它之前有一個空格。如果沒有空格,括號將成爲前一個參數的最後一個字符,並且[會抱怨它的最後一個參數不是]

    $ [ foo = foo] 
    bash: [: missing `]' 
    $ [ foo = 'foo]' 
    bash: [: missing `]' 
    

[[是一個bash增強比[更多的功能,不帶引號的變量名的分別是理智的處理。它需要兩端的空間,與[相同。但[[實際上是特殊的shell語法,並且分析方式不同。這不是像[那樣的「普通命令」。

對於[[[之間的差異的詳細說明,請參見:

+1

+1。但也許值得澄清的是''[''是特殊的語法並不能自我界定。在[['和']]'前後需要空格(或自定義字符),就像'['和']'一樣。自定義字符是空格,製表符和'| &()<>;'。 (由於bash的特性不太準確,因爲'((''''&''是令牌),但它是一個很好的近似值。 – rici