條件測試和判斷語句
在shell 中雨让,用戶可以使用測試語句來測試指定的條件表達(dá)式的條件的真或者假。當(dāng)指定的條件為真時(shí)蝗罗,整個(gè)條件測試的返回值為0艇棕;反之蝌戒,如果指定的條件為假,則條件測試語句的返回值為非0值沼琉。
條件測試的語法有兩種北苟,分別是test和[命令,下面分別來講解它們的語法:
1)test
test 語法如下:
test expression
參數(shù)expression表示需要測試的條件表達(dá)式打瘪,可以由字符串友鼻、整數(shù)、文件名闺骚,以及各種運(yùn)算符組成彩扔。
2)[
與 test 命令相同,[ 命令的作用也是對后面的條件表達(dá)式進(jìn)行測試僻爽,但是為了增加程序的可讀性虫碉,shell要求在表達(dá)式后面追加一個(gè)右方括號 ] 來與前面的 [ 命令配對。語法如下:
[ expression ]
[是命令胸梆,expression 是條件表達(dá)式敦捧。條件表達(dá)式和左右方括號之間都必須有一個(gè)空格须板。
左方括號 [ 是一個(gè)shell命令,而非條件表達(dá)式的一部分兢卵。
而命令與參數(shù)之間必須保留一個(gè)空格习瑰。
所以,在上面的語法中秽荤,expression與左右括號都需保留一個(gè)空格甜奄。
字符串測試
在shell中,可以通過5種運(yùn)算符來對字符串進(jìn)行操作窃款。
字符串運(yùn)算符
運(yùn)算符 | 說明 |
---|---|
string | 判斷指定的字符串是否為空 |
string1 = string2 | 判斷兩個(gè)字符串是否相等 |
string1 != string2 | 判斷兩個(gè)字符串是否不相等 |
-n string | 判斷字符串是否非空串 |
-z string | 判斷字符串是夠?yàn)榭沾?/td> |
對于字符串測試應(yīng)該基本了解贺嫂,但應(yīng)注意以下兩點(diǎn):
- 在給變量賦值的時(shí)候,等號"="左右兩邊一定不要有空格雁乡;否則第喳,shell會(huì)把空格前面的字符串當(dāng)作shell命令
- 在測試運(yùn)算符"="、"!="踱稍、及"-z"等符號的左右兩邊曲饱,一定含有空格
整數(shù)測試
整數(shù)測試的語法形式為:
[ number1 op number2 ]
運(yùn)算符 | 說明 |
---|---|
number1 -eq number2 | 比較number1 和number2是否相等。如果相等珠月,測試結(jié)果為0 |
number1 -ne number2 | 比較number1 和number2是否不相等扩淀。如果不相等,測試結(jié)果為0 |
number1 -gt number2 | 比較number1是否大于number2啤挎。如果大于驻谆,測試結(jié)果為0 |
number1 -lt number2 | 比較number1是否小于number2。如果小于庆聘,測試結(jié)果為0 |
number1 -ge number2 | 比較number1 是否大于等于number2胜臊。如果大于等于,測試結(jié)果為0 |
number1 -le number2 | 比較number1是否小于等于number2伙判。如果小于等于象对,測試結(jié)果為0 |
字符串運(yùn)算符和整數(shù)運(yùn)算符不可以混用。
[root@VM_16_3_centos base]$ x=12.3
[root@VM_16_3_centos base]$ y=12
[root@VM_16_3_centos base]$ [ "$x" -gt "$y" ]
-bash: [: 12.3: integer expression expected
文件測試
[ op file ]
操 作 符 | 說明 |
---|---|
-a file | 文件是否存在宴抚。如果file存在勒魔,則結(jié)果為0 |
-b file | 文件是否存在,且為塊文件菇曲。如果file是一個(gè)已經(jīng)存在的塊文件冠绢,則結(jié)果為0 |
-c file | 文件是否存在,且為字符文件常潮。如果file是一個(gè)已經(jīng)存在的字符文件弟胀,則結(jié)果為0 |
-d file | 文件是否存在,且為目錄。如果file是一個(gè)已經(jīng)存在的目錄邮利,則結(jié)果為0 |
-e file | 同-a操作符 |
-s file | 文件的長度是否大于0或者文件為非空文件弥雹。如果file是一個(gè)非空文件,則結(jié)果為0 |
-f file | 文件存在延届,且為常規(guī)文件剪勿。如果file是一個(gè)已經(jīng)存在的常規(guī)文件,則結(jié)果為0 |
-w file | 文件是否存在且可寫方庭。如果文件按是一個(gè)可寫文件則結(jié)果為0 |
?L file | 文件是否存在厕吉,且為符號鏈接。如果file是一個(gè)已經(jīng)存在的符號鏈接械念,則結(jié)果為0 |
?u file | 文件是否設(shè)置suid位头朱。如果file已經(jīng)設(shè)置了suid位,則結(jié)果為0 |
?r file | 文件是否存在且可讀龄减。如果文件按是一個(gè)可讀文件則結(jié)果為0 |
?x file | 文件是否存在且可執(zhí)行项钮。如果文件按是一個(gè)可執(zhí)行文件則結(jié)果為0 |
邏輯操作符
操作符 | 說明 |
---|---|
!expression | 邏輯非,條件表達(dá)式expression的值為假希停,則該操作符的運(yùn)算結(jié)果為真 |
expression1 -a expression2 | 邏輯與烁巫,條件表達(dá)式expression1和expression2的值都是真時(shí),整個(gè)表達(dá)式的值才為真 |
expression1 ?o expression2 | 邏輯或宠能,條件表達(dá)式 expression1或者expression2的值有一個(gè)為真時(shí)亚隙,整個(gè)表達(dá)式的值就為真 |
條件判斷語句
1.使用簡單的if語句進(jìn)行判斷
if expression
then
statement
statement
fi
例4:通過條件測試判斷某些文件的類型
#!/bin/bash
# 通過條件測試判斷/bin/bash 文件是否存在
if [ -a /bin/bash ]
then
echo "/bin/bash exist!"
fi
結(jié)果為
[root@VM_16_3_centos if_test]$ sh if.sh
/bin/bash exist!
例5:使用空命令作為判斷條件
#! /bin/bash
if :;
then
echo "always true";
fi
空命令":"的退出狀態(tài)永遠(yuǎn)為0,因此會(huì)輸出 always true违崇。
例6:使用&&代替 if 語句進(jìn)行判斷
#! /bi/bash
test "$whoami" != "root" && (echo you are using a non-privileged account; exit 1)
該判斷語句首先對當(dāng)前用戶進(jìn)行判斷阿弃,如果當(dāng)前用戶不為root,也即為真則輸出后面的說明語句羞延。
2.使用if else 語句進(jìn)行流程控制
if expression
then
statement1
statement2
..
else
statement3
statement4
..
fi
3.使用if elif進(jìn)行多條件判斷
if expression
then
statement1
statement2
..
elif expression
then
statement3
statement4
..
else
statement5
..
fi
4.使用exit語句退出程序
exit status
status參數(shù)表示退出狀態(tài)渣淳,該參數(shù)是一個(gè)整數(shù)值,其取值范圍為0~255肴楷;
按照慣例水由,退出狀態(tài)0意味著腳本成功運(yùn)行完畢荠呐;而非0通常意味著程序執(zhí)行過程中出現(xiàn)某些錯(cuò)誤赛蔫。
因此,用戶可以用其它的非0值來給父進(jìn)程傳遞不同的消息泥张,根據(jù)子進(jìn)程的成功或者失敗呵恢,父進(jìn)程采取不同的措施,如果沒有參數(shù)給語句媚创,那么由exit語句之前的那條語句的執(zhí)行狀態(tài)來決定渗钉。
5.多條件判斷語句case
case語句基本語法:
case variable in
value1)
statement1
statement2
..
statementn;;
value2)
statement1
statement2
..
statementn;;
...
valuen)
statement1
statement2
..
statementn;;
#其它情況
*)
statement1
statement2
..
statementn;;
#相當(dāng)于if 結(jié)尾fi
esac
6.利用case語句處理用戶輸入
例7:說明case語句的使用方法
#! /bin/bash
echo "Hit a key, then hit return."
#讀取用戶按下的鍵
read keypress
#case語句開始
case "$keypress" in
#小寫字母
[[:lower:]])
echo "Lowercase letter.";;
[[:upper:]])
echo "Uppercase letter.";;
[0-9])
echo "Digit.";;
*)
echo "other letter.";;
esac
7.運(yùn)算符
1.使用expr外部程序
#!/bin/bash
#注意: 要用反引號括起來
result=`expr 2 - 100`
echo "result=${result}"
result=`expr 2-100`
echo "result=${result}"
result=`expr \( 2 - 6 \) \* 12`
echo "result=${result}"
result=`expr (2-6)*12`
echo "result=${result}"
結(jié)果為
[root@VM_16_3_centos if_test]$ sh expr.sh
result=-98
result=2-100
result=-48
expr.sh: command substitution: line 12: syntax error near unexpected token `2-6'
expr.sh: command substitution: line 12: `expr (2-6)*12'
result=
使用expr命令時(shí)要注意運(yùn)算符左右兩邊的空格,同時(shí)需要將括號進(jìn)行轉(zhuǎn)義表示,括號兩邊也要注意空格
2.使用$((…))
例10:演示使用$((…))符號進(jìn)行算術(shù)運(yùn)算
#!/bin/bash
result=$(( 3+6 ))
echo "result= $result"
result=$(( (1-4) * 5 ))
echo "result= $result"
result= 9
result= -15
3.使用let命令
例11:演示使用let命令執(zhí)行算術(shù)運(yùn)算
#! /bin/bash
n=10
let n=n+1
echo "$n"
let n=n*10
echo "$n"
let n=n**2
echo "$n"
11
110
12100
4.使用位運(yùn)算符
例12:演示使用位運(yùn)算符的方法
#! /bin/bash
result=$[ 2 << 3 ]
echo "$result"
result=$[ 8>> 2 ]
echo "$result"
result=$[ 8 & 4 ]
echo "$result"
result=$[ ~8 ]
echo "$result"
result=$[ 10 ^ 6 ]
echo "$result"
結(jié)果為:
16
2
0
-9
12