內容約制:第五章 引用開始
1.echo $(ls -l)#輸出結果沒有換行
echo "$(ls -l)"#不會去掉分行符號
2.退出碼
(1)exit num(num必須是一個0-255範圍的十進位整數)
(2)如果一個指令碼以不帶參數的exit命令結束,指令碼的退出碼將是執行exit命令前的最後一個命令的退出碼
(3)沒有exit,exit 沒退出碼和exit $?三者時等價的
(4)當一個函數返回時,$?儲存了函數裡最後一個命令的退出碼,當一個指令碼結束時,儲存了指令碼的退出碼。
3.邏輯非(!)
! true ;echo $? #result:1 注意!後面的空格
去掉空格後輸出true
4.
(1)一個if/then結構測試一系列命令的退出碼是否為0(0意味著命令執行成功),這裡跟C是不同的。
(2)if命令不僅能測試【】也可以測試任何命令。
(3)【和test同義字,內建shell,返回比較結果(0真,1假)
【【 】】擴充,是關鍵字 (()) let
(4)test 內建shell,在bash指令碼中的test語句不必調用外部的/usr/bin/test的二進位檔案;同樣【也不必調用/usr/bin/【;其中/usr/bin/【是連結到/usr/bin/test的一個符號連結。
可以用type命令進行查看。
(5)【【】】結構比bash版本的【】更通用,它時從ksh88中引進的test命令的擴充。
i)【【 】】之間的所有字元都不會被檔案擴充或是標記分割,但是會有參數引用和命令替換。
ii)在【【】】測試結構比用【】更能防止指令碼裡的許多邏輯錯誤,比如說&&,||,< ,>操作符能在一個【【】】測試裡通過,但在【】結構會發生錯誤。
(6)(())結構擴充並計算一個算數運算式的值。一個非零值的運算式返回一個0或真作為退出碼,這和test即【】剛好相反。
5.檔案測試操作符
(1)-g 檔案或目錄的設定-ID(sgid)標記是否被設定
如果一個目錄的sgid標誌被設定,在這個目錄下建立的檔案都屬於擁有次目錄的使用者組,而不必時建立檔案的使用者所屬的組。這個特性對在一個工作群組裡的共用目錄很有好處。
(2)-u 檔案的設定-使用者-ID(suid)標誌是否被設定
一個root使用者擁有的二進位執行檔案如果設定了suid標誌,則普通使用者可以以root許可權運行。這對需要存取系統硬體的執行程式(pppd ,cdrecord)很有用。如果沒有設定suid位,則這些二進位執行程式不能有非root的普通使用者調用。用sudo應該也可以吧
6.整數比較
i)-le,-ne,-lt,等在【】中使用,<,<=等在(())中使用。> ,<可以在【】中使用,但需要轉義。!=,=,==可以在【】中使用
使用的時候注意符號兩邊的空格
7.字串比較
if [ -n "$string1" ]:字串不為null,為真
if [ -z "$string2" ]:字串為null,為真
【】中使用!=,=,==,其他的需要轉義
當時用【【】】時則不用轉義
8.混合比較
(1)-a 邏輯與 -o 邏輯或
(2)if 【【 condition1 && condition2 】】等價於 if 【 “expr1‘ -a ”expr2“ 】,if [ $condition1 ]&&[ $condition2 ]
注意比較操作符&&和||不能用於【】中。
9.bash中在函數外可以使用函數中的局部變數。
10.
: $((n=$n+1))冒號是必須的,而且後面有空格。沒有:的話bash會把該句作為命令運行
等價於((n=n+1)),: $[n=$n+1],let "n++",((n++)),: $((n++)),: $[n++]
11.逗號操作符
連結兩個或更多的演算法操作。所有的操作都被求值(可能會有副作用),但值返回最後的一個操作的結構。
let "t1=((5+3,7-1,15-4))" #t1=11
12.數字常量
除非一個數字有特別的首碼或符號,否則shell指令碼把它當成十進位的數。一個首碼為0的數字時八進位。一個首碼為0x的數字是十六進位數