bash中的符號. : () {} [] [[]] (())的解釋

from: http://www.cnscn.org/htm_data/133/0903/21818.html

  bash下有很多像{}、[]等一些符號命令,下面是我對一些常用的符號命令的學習筆記,若有錯誤或紕漏望各位兄弟指正。

一、.(source)
  .(點)與source命令一樣,從文件中讀取並執行命令,無論該文件是否都有可執行權限都能夠正確的執行。且 是在當前shell下執行,而不是產生一個子shell來執行(我們通常使用“./filename.sh”去執行一個文件是在當前shell下產生一個 子shell去執行的)。所以在設置bash的環境的變量時,就必須用該命令或者source命令去執行設置的環境變量纔會對當前shell生效,如下
  for i in/etc/profile.d/*.sh do
  if[-r "$i"]then
  .$i
  fi
  done

二、:
  : 該命令什麼都不做,但執行後會返回一個正確的退出代碼,即exit 0。比如在if語句中,then後面不想做任何操作,但是又不能空着,這時就可以使用“:”來解決,如下:

  if["$i"-ne1 ]then
      :
  else
  echo"$i is not equal 1"
  fi

三、()
  () 將多個命令組合在一起執行,相當於一個命令組。

四、{}

  {} 和()類似,也是將多個命令組合在一起。它們之間的區別是,()是在產生的子shell下執行,而{}是在當前的shell下執行。這與前面講到是使用". filename.sh"和"./filename.sh"的區別一樣。舉一個很簡單的例子:
  # A=123
      # (A=abc echo $A) echo $A
  abc
  123
     #{ A=abc echo $A} echo $A
  abc
  abc
  從上面的示例可以看出,當在()中賦值的變量,影響的只是自身的子shell,而不能將該值賦給父shell,因爲“父親不能繼承兒子”。而在{}中賦值的變量,因爲就在當前的shell執行的,所以就能改變原來變量的值。
  注意:()裏面兩邊可以不使用空格,{}裏面兩邊必須使用空格,且最後一個命令也需要以“;”結尾,表示命令結束。

五、[](test)
  [] 與test命令一樣,用於比較值以及檢查文件類型。如下:
  1、[ "$A" = 123 ]:是字符串的測試,以測試 $A 是否爲 1、2、3 這三個連續的"文字"。
  2、[ "$A" -eq 123 ]:是整數的測試,以測試 $A 是否等於"一百二十三"。
  3、[ -e "$A" ]:是關於文件的測試,以測試 123 這份"文件"是否存在。

六、[[]]
  [[]]可以說是[]的“增強版”,它能夠將多個test命令支持的測試組合起來,例如:
  # [[ (-d "$HOME") &&(-w "$HOME") ]] && echo "home is a writable directory"
  home is a writable directory
  至於這兩者的區別有位仁兄已經寫的很清楚了,我將其整理一下:
  數字測試: -eq-ne-lt-le-gt-ge,[[]]同 []一致
  文件測試: -r、-l、-w、-x、-f、-d、-s、-nt、-ot,[[]]同 []一致
  字符串測試: ><=(同==)!=-n -z,不可使用“<=”和“>=”,[[]]同 []一致,但在[]中,>和<必須使用/進行轉義,即/>和/<
  邏輯測試: []爲 -a -o ![[]]爲&& ||!
  數學運算: []不可以使用 [[]]可以使用+-*/ %
  組合: 均可用各自邏輯符號連接的數字(運算)測試、文件測試、字符測試
  拿這兩者對字符串的測試舉一個例子,如下:
  # [a />1 ]&&echoture ||echofalse
  ture
  # [[a >1 ]]&&echoture ||echofalse
  ture
  字符串的比較是根據相應的ASCII碼來比較的,所以a>1是成立的。如果有興趣也可以思考一下爲什麼會出現下面的結果?
  # [[a >1 ]]&&echoture ||echofalse
  ture

七、(())
  (())專門來做數值運算,如果表達式求值爲 0,則設置退出狀態爲 1;如果求值爲非 0 值,則設置爲 0。不需要對 ((和 ))之間的操作符轉義。算術只對整數進行。除 0 會產生錯誤,但不會產生溢出。可以執行 C 語言中常見的算術、邏輯和位操作。如下:
  # ((i=1+99)) && echo$i
  100
  也能:
  # i=99 && ((i++)) && echo$i
  100
  除此之外,也可以使用$(())直接進行數值運算,如下:
  # echo $((2**3))
  8
  注意:使用 (( )) 時,不需要空格分隔各值和運算符,使用[]和[[ ]] 時需要用空格分隔各值和運算符

發佈了12 篇原創文章 · 獲贊 1 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章