shell中if條件字符串、數字比對,[[ ]]和[ ]區別

shell 括號

test 和 []符號

二者是同樣的,在命令行裏test expr和[ expr ]的效果相同。要注意的有:正則表達式

  1. test中可用的比較運算符只有==和!=
  2. 二者都是用於字符串比較的,不可用於整數比較,整數比較只能使用-eq, -gt這種形式。
  3. 不管是字符串比較仍是整數比較都千萬不要使用大於號小於號。固然,若是你實在想用也是能夠的,對於字符串比較可使用尖括號的轉義形式,若是比較"ab"和"bc":[ ab \< bc ],結果爲真,也就是返回狀態爲0.

test 的基本做用

test的三個基本做用是判斷文件、判斷字符串、判斷整數。支持使用與或非將表達式鏈接起來。shell

[[]] 符號

這是內置在shell中的一個命令,支持字符串的模式匹配(使用=~操做符時甚至支持shell的正則表達式)。邏輯組合能夠不使用test的-a,-o而使用&&,||這樣更親切的形式(針對c、Java程序員)。固然,也不用想的太複雜,基本只要記住:bash

  1. 字符串比較時能夠把右邊的做爲一個模式(這是右邊的字符串不加雙引號的狀況下。若是右邊的字符串加了雙引號,則認爲是一個文本字符串。),而不單單是一個字符串,好比[[ hello == hell? ]],結果爲真。
  2. 使用[]和[[]]的時候不要吝嗇空格,每一項兩邊都要有空格,[[ 1 == 2 ]]的結果爲「假」,但[[ 1==2 ]]的結果爲「真」!後一種顯然是錯的。

let和(())符號

二者也是同樣的(或者說基本上是同樣的,雙括號比let稍弱一些)。主要進行算術運算(上面的兩個都不行),也比較適合進 行整數比較,能夠直接使用熟悉的<,>等比較運算符。能夠直接使用變量名如var而不須要$var這樣的形式。支持分號隔開的多個表達式測試

"[]" , "[[]]" 和 "(())"對比

  1. 首先,儘管很類似,可是從概念上講,兩者是不一樣層次的東西。
    1. "[[",是關鍵字,許多shell(如ash bsh)並不支持這種方式。ksh, bash(聽說從2.02起引入對[[的支持)等支持。
    2. "["是一條命令, 與test等價,大多數shell都支持。在現代的大多數sh實現中,"["與"test"是內部(builtin)命令,換句話說執行"test"/"["時不會調用/some/path/to/test這樣的外部命令(若是有這樣的命令的話)。
  2. [[]]結構比Bash版本的[]更通用。在[[和]]之間的全部的字符都不會被文件擴展或是標記分割,可是會有參數引用和命令替換。用[[ ... ]]測試結構比用[ ... ]更能防止腳本里的許多邏輯錯誤。好比說,&&,||, <和> 操做符能在一個[[]]測試裏經過,但在[]結構會發生錯誤。
  3. (( ))結構擴展並計算一個算術表達式的值。若是表達式值爲0,會返回1或假做爲退出狀態碼。一個非零值的表達式返回一個0或真做爲退出狀態碼。這個結構和先前test命令及[]結構的討論恰好相反。
  4. [ ... ]爲shell命令,因此在其中的表達式應是它的命令行參數,因此串比較操做符">" 與"<"必須轉義,不然就變成IO改向操做符了(請參看上面2中的例子)。在[[中"<"與">"不需轉義;因爲"[["是關鍵字,不會作命令行擴展,於是相對的語法就稍嚴格些。例如在[ ... ]中能夠用引號括起操做符,由於在作命令行擴展時會去掉這些引號,而在[[ ... ]]則不容許這樣作。
    file
相關文章
相關標籤/搜索