Bash中的括號(一)


初學Bash腳本編程,里面的各種括號,絕對是一個大坑,為了救人救己,以防再度入坑,特記錄如下:

一、單小括號:

      1、創建子Shell。單個小括號用來創建一個子shell,子shell允許你在不影響當前shell的環境下去執行操作。例如:

pwd
/root
(cd /tmp;pwd)
/tmp

又如,你在 home 目錄,cd 到 /tmp 目錄,sleep 5 秒,最后 cd 回 home,但是你會在 sleep 的過程中按 Ctrl + c 中斷。命令如下:

~$ cd /tmp/; sleep 5; cd ~
^C
/tmp$

你會留在 /tmp 目錄中,因為最后的 cd ~ 根本沒執行。所以如果你希望臨時切換別的目錄執行某些命令,但又希望中斷后回到原來的目錄,這個方法就不湊效了。

但是如果你加上小括號:

~$ ( cd /tmp/; sleep 5; )
^C
~$

這里沒有最后的 cd ~,因為多此一舉,subshell 有自己的工作目錄,相當於你另外開一個終端而已,這樣避免一些環境變量被某些代碼弄亂。

 

      2、小括號還有命令替換的功能,result=$(command)與result=`command`有同樣的效果。

var=$(pwd)
echo $var
/root

     3、用於初始化數組。如: array=(a b c d) 

二、單方括號:

     1、[和test是等同的,均是shell的內置命令,使用type測試一下:

[root@noi ~]# type [
[ is a shell builtin
[root@noi ~]# type test
test is a shell builtin

     2、Test和[]中可用的比較運算符只有==和!=,兩者都是用於字符串比較的,不可用於整數比較,整數比較只能使用-eq,-gt這種形式。無論是字符串比較還是整數比較都不支持大於號小於號。如果實在想用,對於字符串比較可以使用轉義形式,如果比較"ab"和"bc":[ ab \< bc ],結果為真,也就是返回狀態為0。[ ]中的邏輯與和邏輯或使用-a 和-o 表示。

舉個例子(坑了我好一陣子,才弄明白):

#3比1大,返回0表示真,正確
[root@noi ~]# [ 3 \> 1 ];echo $?
0
#3比10小,返回0,錯誤,原因是[和test默認均是比較的字符串,而字符'3'比字符'1'(字符串“10”的第一個字符)大,所以返回真。
[root@noi ~]# [ 3 \> 10 ];echo $?
0

上面的例子中 [ 3 \> 10 ] 實際上shell執行的是 [ '3' \> '10' ] 這樣寫就清楚多了,呵呵。

     3、需要注意的是:[]中每個字符之間必須由空格隔開,否則shell就會報錯。

     4、如果真想比較數字,可以用:-gt(大於),-lt(小於),-ge(大於等於),-le(小於等於),-eq(等於),-ne(不能於)

[root@noi ~]# [ 3 -gt 1 ];echo $?
0
[root@noi ~]# [ 3 -gt 10 ];echo $?
1
[root@noi ~]# [ 5 -lt 2 ];echo $?
1
[root@noi ~]# [ 5 -gt 2 ];echo $?
0

     5、最后一個坑,在[和test測試中,用0表示真(助記0表示沒有錯誤),用1表示假(助記1表示有錯誤),之所以要這樣搞,和c程序反着,

就是因為,shell負責接收其他程序的返回值,而返回值正確(對應一種情況),返回值錯誤(各種各樣的原因導致很多錯誤類型,需要用不同數值表示),

這樣的話,用0(表真)和其他值(表假)可以完美解決這個問題。可以這樣理解,除了返回0是正確的以外,返回其他值都是有問題的,呵呵。

以上是常規的用法,但是光這些還不夠啊,所以需要用到其他的表達式寫法,我先保存下,下篇接着寫。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM