1、條件測試
兩種格式: test condition 或 [ condition ](注意兩邊加了空格)
condition可以是多個子條件的邏輯運算,邏輯運算子號有以下幾種:
-a 邏輯與
-o 邏輯或
! 邏輯否
&&, ||
2、檔案測試
檔案測試利用條件測試的方式測試一個檔案或者目錄的狀態,如是否存在、是否可讀等,具體的測試參數如下:
-d 目錄
-f 普通檔案(Regular file)
-L 符號連結
-r Readable(檔案、目錄可讀)
-b 塊專用檔案
-e 檔案存在
-g 如果檔案的set-group-id位被設定則結果為真
-s 檔案長度大於0,非空
-z 檔案長度=0
-w Writable(檔案、目錄可寫)
-u 檔案有suid位設定
-x Executable(檔案可執行、目錄可瀏覽)
-c 字元專用檔案
-L 符號連結
例如測試檔案file.txt是否存在,可以這樣測試:
$test -e file.txt 或者 [ -e file.txt ]
3、字串測試
字串測試可以測試字串是否為空白,測試兩個字串是否相等等,具體的測試參數如下:
= 兩字串相等
!= 兩字串不等
-z 空串 [zero]
-n 非空串 [nozero]
4、數值測試
數值測試用於測試兩個參數的大小、相等等情況,格式是:“number” numberic_operator “number” 或 [ “number” numberic_operator “number”],numberic_operator取值如下:
-eq 數值相等(equal)
-ne 不等(not equal)
-gt A>B(greater than)
-lt A<B(less than)
-le A<=B(less、equal)
-ge A>=B(greater、equal)
(疑問:好像不能用一個變數跟一個數值常量比較,要將值賦給變數然後比較兩個變數,待考證!)
5、if結構
if 條件1
then
命令1
elif 條件2
then
命令2
else
命令3
fi
6、case結構
case variable in
pattern [| pattern] …..) #匹配模式之間用"|"隔開
命令….
;;
模式2)
命令…..
;;
*) #匹配所有
…….
;;
esac
7、for結構
for 變數名 in 列表
do
命令1
命令2
done
例子:
用於數值序列:
for loop in 1 2 3 4 5
for i in {1..10}
for ((i = 1; i <= 10; i++))
用於字串序列:
for loop in “orange red blue grey”
用於命令的執行結果:
for loop in `ls`
無限迴圈:
for files in *
8、until結構
until condition
do
命令…..
done
9、while結構
while condition
do
命令1
命令2
done
10、bash 的組數(array)
一般而言,A="a b c def" 這樣的變數只是將 $A 替換為一個單一的符串,
但是改為 A=(a b c def) ,則是將 $A 定義為組數...
bash 的組數替換方法可參考如下方法:
${A[@]} 或 ${A[*]} 可得到 a b c def (全部組數)
${A[0]} 可得到 a (第一個組數),${A[1]} 則為第二個組數...
${#A[@]} 或 ${#A[*]} 可得到 4 (全部組數數量)
${#A[0]} 可得到 1 (即第一個組數(a)的長度),${#A[3]} 可得到 3 (第四個組數(def)的長度)
A[3]=xyz 則是將第四個組數重新定義為 xyz ...
11、三個重要符號
hard quote:' ' (單引號),凡在 hard quote 中的所有 meta 均被關閉。
soft quote: " " (雙引號),在 soft quoe 中大部份 meta 都會被關閉,但某些則保留(如 $ )。
escape : \ (反斜線),只有緊接在 escape (跳脫字元)之後的單一 meta 才被關閉。
例如:命令echo '$0 outside function is '$0,第一個$0不會解開,直接輸出字元"$0",而第二個$0會被解開,輸出當前shell script的路徑;
如果用命令echo "$0 outside function is "$0,則兩個$0都會被解開,因此不能達到想要的結果。
(注意:在vim中編寫shell script時,vim的顏色提示就可以看出符號是否解開,即是按一般字元串處理,還是按meta處理)
【其他重點規則】
- ( ):將其內的命令置於 nestedsubshell 執行,或用於運算或命令替換。(變數修改是臨時的)
- { }:將其內的命令置於 non-namedfunction 中執行,或用在變數替換的界定範圍。(變數修改對本shell有效)
- ${ }或` `(反引號):用來做命令替換,也就是執行括弧裡面的命令列,然後返回命令列執行的結果。
- $(( )):用來做整數計算。如:
$ a=5; b=7; c=2
$ echo $(( a+b*c ))
- (( )):可重定義變數值,或作條件測試。如:
a=5; ((a++)) 可將 $a 重定義為 6
a=5; b=7; ((a < b)) 會得到0 (true) 的傳回值。
- 命令、函數或者shell指令碼的傳回值只有兩種:0為"真"( true ),非0為"假"( false )
- $#: 添加到Shell的參數個數
- $$: Shell本身的PID(ProcessID)
- $!: Shell最後啟動並執行後台Process的PID
- $?: 最後啟動並執行命令的結束代碼(傳回值)
- $*: 所有參數列表。如"$*"用「"」括起來的情況、以"$1 $2 … $n"的形式輸出所有參數。
- $@: 所有參數列表。如"$@"用「"」括起來的情況、以"$1" "$2" … "$n" 的形式輸出所有參數。