2013-06-24 33 views
2
  1. if [[ 23ab = *ab ]] ; then echo yes; fi瞭解之間的差=和=〜運營商在bash [[]]

    是對上面的代碼正則表達式?

    請參閱以下內容:

  2. if [[ 23ab =~ [0-9]{1,2}ab ]] ; then echo yes; fi

因此,這行是一個正則表達式?如果第一行不是正則表達式,爲什麼當我們使用*時會起作用? 如果是,但是當我們使用=而不是=~時,如 if [[ 23ab = [0-9]{1,2}ab ]],它現在不起作用。

你能解釋兩條線的區別嗎?

+0

我假設你在問這裏「bash」有幾種不同的shell可以在Linux上運行,最好清楚一下你問的是哪一個。 (POSIX sh不支持'[[]]',所以它顯然不是一個純粹的POSIX shell,比如ash或dash ...但理論上你可以問ksh或者zsh或其他的) 。 –

+0

爲簡單起見,您可以使用以下語法:'[[23ab = * ab]] && echo「yes」' –

回答

4

[[ $a =~ $b ]]是一個正則表達式匹配。在此語法中,*與前一個字符或模式的0-n個實例匹配。

[[ $a = $b ]]是一個glob風格的模式匹配。在此語法中,*匹配任何類型的0到n個字符。

請注意,將bash中的正則表達式存儲在變量中很重要。那就是:

re='[0-9]{1,2}ab' 
[[ $foo =~ $re ]] 

,實際上可能是不同

[[ $foo =~ [0-9]{1,2}ab ]] 

...取決於您正在運行的bash的版本。總是使用一個變量可以防止這個問題。

注意,這些都不同於

re='[0-9]{1,2}ab' 
[[ $foo =~ "$re" ]] ## <- LITERAL SUBSTRING MATCH _NOT_ REGULAR EXPRESSION MATCH 

...在這種情況下,引用使得$re文字,即內容。 不是像現代bash中的正則表達式那樣處理。

+1

嗨Charles, 非常感謝!還有一個問題,正則表達式必須放在右邊,我的意思是:[[$ foo =〜[0-9] {1,2} ab]]是正確的! 但[[[0-9] {1,2} ab =〜$ foo]]是錯誤的,對吧? – Jack

+0

@Jack正確;該模式或正則表達式可能只在右側。 –