if語句測試條件,測試條件返回真(0)或假(1)後,可相應執行一系列語句。if語句結構對錯誤檢查非常有用。其格式為:
if 條件1
then 命令1
elif 條件2
then 命令2
else
命令3
fi
if語句必須以單詞fi終止。在if語句中漏寫fi是最一般的錯誤。我自己有時也是這樣。elif和else為可選項,如果語句中沒有否則部分,那麼就不需要elif和else部分。if語句可以有許多elif部分。
來,做個例子:
[root@localhost /]# vi ifcp.sh
#!/bin/sh
if cp myfile myfile.chen; then
echo "good copy"
else
echo "$0 :error could not copy the files"
fi
[root@localhost test]# sh ./ifcp.sh
cp: cannot stat `myfile': No such file or directory
./ifcp.sh :error could not copy the files
我們沒有myfile這個檔案,當然就出差啦。那麼建立一個檔案:
[root@localhost test]# echo "I love zengshuai" > myfile
[root@localhost test]# sh ./ifcp.sh
good copy
這裡只是要注意一點:$#表示包括$0在內的命令列參數的個數。
在Shell中,指令碼名稱本身是$0,我們這裡就是“./ifcp.sh”,剩下的依次是$1、$2…、${10}、${11},等等。
$*表示整個參數列表,不包括$0,也就是說不包括檔案名稱的參數列表。
不過,我們一般在shell中會利用一種更強大的if條件判斷,即 if [] 格式。下面附上 if [] 格式的測試選項:
–b 當file存在並且是塊檔案時返回真
-c 當file存在並且是字元檔案時返回真
-d 當pathname存在並且是一個目錄時返回真
-e 當pathname指定的檔案或目錄存在時返回真
-f 當file存在並且是正規檔案時返回真
-g 當由pathname指定的檔案或目錄存在並且設定了SGID位時返回為真
-h 當file存在並且是符號連結檔案時返回真,該選項在一些老系統上無效
-k 當由pathname指定的檔案或目錄存在並且設定了“粘滯”位時返回真
-p 當file存在並且是命令管道時返回為真
-r 當由pathname指定的檔案或目錄存在並且可讀時返回為真
-s 當file存在檔案大小大於0時返回真
-u 當由pathname指定的檔案或目錄存在並且設定了SUID位時返回真
-w 當由pathname指定的檔案或目錄存在並且可執行時返回真。一個目錄為了它的內容被訪問必然是可執行檔。
-o 當由pathname指定的檔案或目錄存在並且被子當前進程的有效使用者ID所指定的使用者擁有時返回真。
UNIX Shell 裡面比較字元寫法:
-eq 等於
-ne 不等於
-gt 大於
-lt 小於
-le 小於等於
-ge 大於等於
-z 空串
= 兩個字元相等
!= 兩個字元不等
-n 非空串
更為詳細的說明:
運算子 描述 樣本
檔案比較子
-e filename 如果 filename 存在,則為真 [ -e /var/log/syslog ]
-d filename 如果 filename 為目錄,則為真 [ -d /tmp/mydir ]
-f filename 如果 filename 為常規檔案,則為真 [ -f /usr/bin/grep ]
-L filename 如果 filename 為符號連結,則為真 [ -L /usr/bin/grep ]
-r filename 如果 filename 可讀,則為真 [ -r /var/log/syslog ]
-w filename 如果 filename 可寫,則為真 [ -w /var/mytmp.txt ]
-x filename 如果 filename 可執行,則為真 [ -L /usr/bin/grep ]
filename1 -nt filename2 如果 filename1 比 filename2 新,則為真 [ /tmp/install/etc/services -nt /etc/services ]
filename1 -ot filename2 如果 filename1 比 filename2 舊,則為真 [ /boot/bzImage -ot arch/i386/boot/bzImage ]
字串比較運算子 (請注意引號的使用,這是防止空格擾亂代碼的好方法)
-z string 如果 string 長度為零,則為真 [ -z $myvar ]
-n string 如果 string 長度非零,則為真 [ -n $myvar ]
string1 = string2 如果 string1 與 string2 相同,則為真 [ $myvar = one two three ]
string1 != string2 如果 string1 與 string2 不同,則為真 [ $myvar != one two three ]
算術比較子
num1 -eq num2 等於 [ 3 -eq $mynum ]
num1 -ne num2 不等於 [ 3 -ne $mynum ]
num1 -lt num2 小於 [ 3 -lt $mynum ]
num1 -le num2 小於或等於 [ 3 -le $mynum ]
num1 -gt num2 大於 [ 3 -gt $mynum ]
num1 -ge num2 大於或等於 [ 3 -ge $mynum ]