1. if 語句
"if"運算式如果條件為真,則執行then後的部分:
Toggle line numbers
1 if ....; then
2 ....
3 elif ....; then
4 ....
5 else
6 ....
7 fi
大多數情況下,可以使用測試命令來對條件進行測試,比如可以比較字串、判斷檔案是否存在及是否可讀等等……通常用" [ ] "來表示條件測試,注意這裡的空格很重要,要確保方括弧前後的空格。
[ -f "somefile" ] :判斷是否是一個檔案
[ -x "/bin/ls" ] :判斷/bin/ls是否存在並有可執行許可權
[ -n "$var" ] :判斷$var變數是否有值
[ "$a" = "$b" ] :判斷$a和$b是否相等
執行man test可以查看所有測試運算式可以比較和判斷的類型。下面是一個簡單的if語句:
Toggle line numbers
1 #!/bin/sh
2
3 if [ "$SHELL" = "/bin/bash" ]; then
4 echo "your login shell is the bash (bourne again shell)"
5 else
6 echo "your login shell is not bash but $SHELL"
7 fi
變數$SHELL包含有登入shell的名稱,我們拿它和/bin/bash進行比較以判斷當前使用的shell是否為bash。
2. && 和|| 操作符
熟悉C語言的朋友可能會喜歡下面的運算式:
[ -f "/etc/shadow" ] && echo "This computer uses shadow passwords"
這裡的 && 就是一個快捷操作符,如果左邊的運算式為真則執行右邊的語句,你也可以把它看作邏輯運算裡的與操作。上述指令碼表示如果/etc/shadow檔案存在,則列印”This computer uses shadow passwords”。同樣shell編程中還可以用或操作(||),例如:
Toggle line numbers
1 #!/bin/sh
2
3 mailfolder=/var/spool/mail/james
4 [ -r "$mailfolder" ] || { echo "Can not read $mailfolder" ; exit 1; }
5 echo "$mailfolder has mail from:"
6 grep "^From " $mailfolder
該指令碼首先判斷mailfolder是否可讀,如果可讀則列印該檔案中的"From" 一行。如果不可讀則或操作生效,列印錯誤資訊後指令碼退出。需要注意的是,這裡我們必須使用如下兩個命令:
-列印錯誤資訊
-退出程式
我們使用花括弧以匿名函數的形式將兩個命令放到一起作為一個命令使用;普通函數稍後再作說明。即使不用與和或操作符,我們也可以用if運算式完成任何事情,但是使用與或操作符會更便利很多。
3. case 語句
case運算式可以用來匹配一個給定的字串,而不是數字(可別和C語言裡的switch...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 類型的壓縮檔:
Toggle line numbers
1 #!/bin/sh
2
3 ftype=`file "$1"`
4 case "$ftype" in
5 "$1: Zip archive"*)
6 unzip "$1" ;;
7 "$1: gzip compressed"*)
8 gunzip "$1" ;;
9 "$1: bzip2 compressed"*)
10 bunzip2 "$1" ;;
11 *) error "File $1 can not be uncompressed with smartzip";;
12 esac
ERROR: EOF in multi-line statement
你可能注意到上面使用了一個特殊變數$1,該變數包含有傳遞給該指令碼的第一個參數值。也就是說,當我們運行:
smartzip articles.zip
$1 就是字串 articles.zip。
4. select 語句
select運算式是bash的一種擴充應用,擅長於互動式場合。使用者可以從一組不同的值中進行選擇:
Toggle line numbers
1 select var in ... ; do
2 break
3 done
4 .... now $var can be used ....
下面是一個簡單的樣本:
Toggle line numbers
1 #!/bin/sh
2
3 echo "What is your favourite OS?"
4 select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do
5 break
6 done
7 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
5. while/for 迴圈
在shell中,可以使用如下迴圈:
Toggle line numbers
1 while ...; do
2 ....
3 done
只要測試運算式條件為真,則while迴圈將一直運行。關鍵字"break"用來跳出迴圈,而關鍵字”continue”則可以跳過一個迴圈的餘下部分,直接跳到下一次迴圈中。
for迴圈會查看一個字串列表(字串用空格分隔),並將其賦給一個變數:
Toggle line numbers
1 for var in ....; do
2 ....
3 done
下面的樣本會把A B C分別列印到螢幕上:
Toggle line numbers
1 #!/bin/sh
2
3 for var in A B C ; do
4 echo "var is $var"
5 done
下面是一個實用的指令碼showrpm,其功能是列印一些RPM包的統計資訊:
Toggle line numbers
1 #!/bin/sh
2
3 # list a content summary of a number of RPM packages
4 # USAGE: showrpm rpmfile1 rpmfile2 ...
5 # EXAMPLE: showrpm /cdrom/RedHat/RPMS/*.rpm
6 for rpmpackage in $*; do
7 if [ -r "$rpmpackage" ];then
8 echo "=============== $rpmpackage =============="
9 rpm -qi -p $rpmpackage
10 else
11 echo "ERROR: cannot read file $rpmpackage"
12 fi
13 done
這裡出現了第二個特殊變數$*,該變數包含有輸入的所有命令列參數值。如果你運行showrpm openssh.rpm w3m.rpm webgrep.rpm,那麼 $* 就包含有 3 個字串,即openssh.rpm, w3m.rpm和 webgrep.rpm。