標籤:shell編程;選擇
Shell編程學習之二
一、bash的條件測試
測試方法或者說測試書寫:
test EXPR
[ EXPR ]
[[ EXPR ]]
例如:測試變數 User_Name 的之是否為root
test $User_Name="root"
[ $User_Name == "root" ]
[[ $User_Name == "root" ]
根據比較時運算元的類型,測試類型分為:
測試類型 |
運算子 |
運算子所代表的意義 |
樣本 |
整形測試 |
-gt -lt -ge -le -eq -ne |
-gt 大於 -lt 小於 -ge 大於或等於 -le 小於或等於 -eq 等於 -ne 不等於 |
都是雙目運算子: [ $num -gt 3 ] test $num -ne $sum [[ $num -ne 0 ]] |
字元測試 |
== =~ > < != |
== 等於 >大於 < 小於 != 不等於 =~ 模式比對 |
都是雙目運算子: [ $num == "root"] test $num > $sum [[ "$num" =~ /bin/bash$ ]] 這裡注意 =~只能用 [[ ]]去匹配,而且=~後面的PATTERN(模式)不能使用"",‘‘等引用字元 |
-n -z |
-z 測試檔案內容是否為空白,為空白時真,不為空白為假 -n 測試檔案內容是否為不空,不空為真,空為假 |
單目運算子 [ -n "$file_name" ] |
檔案測試 |
-a|e -f -L|h -d -b -c -S -p -s -r -w -x -N |
-a|e 測試檔案存在 -f 測試檔案為一般檔案 -L|h 測試檔案為軟串連檔案 -d 測試檔案是否為目錄 -b -c -p -S 測試檔案為塊裝置、字元裝置、管道檔案、socket檔案 -r -w -x 測試檔案可讀、可寫、可執行 -s 測試檔案為空白檔案 -N 測試檔案Mtime新於Atime |
都是單目運算子 [ -f "$file_name" ] [[ -b "$file_name" ]] test -x $file_name |
-nt -ot |
file1 -nt file2 file1的Mtime新於file2的Mtime file1 -ot file2 file1的Mtime舊於file2的Mtime |
雙目運算子 [ file1 -nt "$file_name" ] [[ $file1 -ot "$file_name" ]] |
二、邏輯運算
布爾運算:布爾運算的結果只有2中:真和假。
常見的邏輯運算有:與 或 非 異或。與或非常用 && || ! 來表示。
與的邏輯關係:
或的邏輯關係:
非的邏輯關係:
異或的邏輯關係:相同為假,不同為真
三、選擇
bash中的選擇語句通常有if,case。當然if,case在大多數情況下是可以相互轉換的。
1)if選擇語句
1、單分支if語句:
if CONDITION;then
選擇分支
fi
2、雙分支的if語句:
if CONDITION;then
選擇分支1
else
選擇分支2
fi
3、多分支的if語句:
if CONDITION1;then
選擇分支1
elif CONDITION2;then
選擇分支2
elif CONDITION3;then
選擇分支3
...
else
選擇分支n
fi
4、練習
寫一個指令碼,完成如下任務,其使用形式如下所示:
script.sh {start|stop|restart|status}
其中:
如果參數為空白,則顯示協助資訊,並退出指令碼;
如果參數為start,則建立空檔案/var/lock/subsys/script,並顯示“starting script successfully.”
如果參數為stop,則刪除檔案/var/lock/subsys/script,並顯示“Stop script successfully.”
如果參數為restart,則刪除檔案/var/locksubsys/script並重新建立,而後顯示“Restarting script successfully.”
如果參數為status,那麼:
如果檔案/var/lock/subsys/script存在,則顯示“Script is running...”,否則,則顯示“Script is stopped.”
說明:script.sh是指令檔名,在建立時,其名稱可以自己隨意定義,但如果其名稱發生變數,上/var/lock/sussys/下的檔案名稱也要隨之而變;
[[email protected] scripts]# cat myhttpd#!/bin/bash## Description: # Version: 0.0.1# Author: Alex# Date: 2014-07-09#判斷參數個數,如果參數小於1,則提示用法並退出if [ $# -lt 1 ];then echo "Usage: `basename $0` {start|stop|restart|status}" exit 2fi#判斷/var/lock/subsys是否存在,不存在則建立此目錄if [ ! -d /var/lock/subsys ];then/bin/mkdir -p /var/lock/subsysfiif [ "$1" == "start" ];then#如果/var/lock/subsys/`basename $0`檔案不存在,則建立,並顯示啟動成功;若存在則提示已啟動[ ! -e "/var/lock/subsys/`basename $0`" ] && /bin/touch "/var/lock/subsys/`basename $0`" && echo "Starting `basename $0` successfully." || echo "`basename $0` is already start."elif [ "$1" == "stop" ];then#如果/var/lock/subsys/`basename $0`檔案存在,則刪除,並顯示關閉成功;若不存在則顯示關閉失敗[ -e "/var/lock/subsys/`basename $0`" ] && /bin/rm -f "/var/lock/subsys/`basename $0`" && echo "Stop myhttpd successfully." || echo -e "Stopping myhttpd \033[31mFAILED\033[0m."elif [ "$1" == "status" ];then#如果/var/lock/subsys/`basename $0`檔案存在,顯示running;若不存在則提示stopd[ -e "/var/lock/subsys/`basename $0`" ] && echo "`basename $0` is running..." || echo "`basename $0` is stopped."elseecho "Usage: `basename $0` {start|stop|restart|status}"fi
四、其他
1、組合條件測試:在多個條件間實現邏輯運算
與:[ condition1 -a condition2 ]
condition1 && condition2
或:[ condition1 -o condition2 ]
condition1 || condition2
非:[ -not condition ]
! condition
2、bash編程之互動編程
read 與使用者互動進行
-p "prompt" 提示句
-t timeout 設定逾時時間
3、exit
程式退出語句,一般是 exit n 這樣使用,n是錯誤狀態值。
4、shift
通常是shift n 這樣使用,n是要踢掉的參數個數
[[email protected] scripts]# cat ./aboutshift #!/bin/bashecho $1shift 2 #踢掉2個參數echo $1shift 3 #踢掉3個參數echo $1[[email protected] scripts]# ./aboutshift 1 2 3 4 5 6 7 8 9 10136
未完待續....
本文出自 “黑夜過後” 部落格,請務必保留此出處http://guoting.blog.51cto.com/8886857/1436505