Linux shell指令碼基礎學習第三講,前面我們介紹shell命令和流程式控制制時,由於篇幅沒能講流程式控制制,今天流程式控制制我們這裡也只是介紹前面三各部分 if case 和 select。後面還有三個部分內容只能在Linux shell指令碼基礎學習第四講中介紹了。
1.1.5 Shell命令和流程式控制制(2)
3) 流程式控制制
1.if
"if" 運算式 如果條件為真則執行then後面的部分:
if ....; then
....
elif ....; then
....
else
....
fi
大多數情況下,可以使用測試命令來對條件進行測試。比如可以比較字串、判斷檔案是否存在及是否可讀等等…
通常用" [ ] "來表示條件測試。注意這裡的空格很重要。要確保方括弧的空格。
[ -f "somefile" ] :判斷是否是一個檔案
[ -x "/bin/ls" ] :判斷/bin/ls是否存在並有可執行許可權
[ -n "$var" ] :判斷$var變數是否有值
[ "$a" = "$b" ] :判斷$a和$b是否相等
執行man test可以查看所有測試運算式可以比較和判斷的類型。
直接執行以下指令碼:
#!/bin/sh
if [ "$SHELL" = "/bin/bash" ]; then
echo "your login shell is the bash (bourne again shell)"
else
echo "your login shell is not bash but $SHELL"
fi
變數$SHELL包含了登入shell的名稱,我們和/bin/bash進行了比較。
快捷操作符
熟悉C語言的朋友可能會很喜歡下面的運算式:
[ -f "/etc/shadow" ] && echo "This computer uses shadow passwors"
這裡 && 就是一個快捷操作符,如果左邊的運算式為真則執行右邊的語句。
您也可以認為是邏輯運算中的與操作。上例中表示如果/etc/shadow檔案存在則列印” This computer uses shadow passwors”。同樣或操作(||)在shell編程中也是可用的。這裡有個例子:
#!/bin/sh
mailfolder=/var/spool/mail/james
[ -r "$mailfolder" ]' '{ echo "Can not read $mailfolder" ; exit 1; }
echo "$mailfolder has mail from:"
grep "^From " $mailfolder
該指令碼首先判斷mailfolder是否可讀。如果可讀則列印該檔案中的"From" 一行。如果不可讀則或操作生效,列印錯誤資訊後指令碼退出。這裡有個問題,那就是我們必須有兩個命令:
-列印錯誤資訊
-退出程式
我們使用花括弧以匿名函數的形式將兩個命令放到一起作為一個命令使用。一般函數將在下文提及。
不用與和或操作符,我們也可以用if運算式作任何事情,但是使用與或操作符會更便利很多。
2.case
case :運算式可以用來匹配一個給定的字串,而不是數字。
case ... in
...) do something here ;;
esac
讓我們看一個例子。 file命令可以辨別出一個給定檔案的檔案類型,比如:
file lf.gz
這將返回:
lf.gz: gzip compressed data, deflated, original filename,
last modified: Mon Aug 27 23:09:18 2001, os: Unix
我們利用這一點寫了一個叫做smartzip的指令碼,該指令碼可以自動解壓bzip2, gzip 和zip 類型的壓縮檔:
#!/bin/sh
ftype=`file "$1"`
case "$ftype" in
"$1: Zip archive"*)
unzip "$1" ;;
"$1: gzip compressed"*)
gunzip "$1" ;;
"$1: bzip2 compressed"*)
bunzip2 "$1" ;;
*) echo "File $1 can not be uncompressed with smartzip";;
esac
您可能注意到我們在這裡使用了一個特殊的變數$1。該變數包含了傳遞給該程式的第一個參數值。
也就是說,當我們運行:
smartzip articles.zip
$1 就是字串 articles.zip
3. selsect
select 運算式是一種bash的擴充應用,尤其擅長於互動式使用。使用者可以從一組不同的值中進行選擇。
select var in ... ; do
break
done
.... now $var can be used ....
下面是一個例子:
#!/bin/sh
echo "What is your favourite OS?"
select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do
break
done
echo "You have selected $var"
下面是該指令碼啟動並執行結果:
What is your favourite OS?
1) Linux
2) Gnu Hurd
3) Free BSD
4) Other
#? 1
You have selected Linux
上面就是這一講的內容,控制流程程比較多,這裡先介紹這三個。