條件測試和判斷語句
在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