1、if-then語句
格式如下:
if command
then
commands
fi
或者
if command; then
commands
fi
2、嵌套if
格式如下:
if command
then
commands
else
commands
if command
then
commands
fi
fi
或者
if command
then
commands
elif command
then
commands
fi
3、test命令
test命令的格式非常簡單,如下
test condition
condition 是test命令要測試的一系列參數和值。當用在if-then語句中時,test命令使用方式如下:
if test condition
then
commands
fi
bash shell提供了另一種條件測試方法,無需在if-then語句中聲明test命令。
if [ condition ]
then
commands
fi
方括號定義了測試條件,注意,第一個方括號和第二個方括號之前必須加上一個空格。
test命令可以判斷三類條件:
數值比較
字符串比較
文件比較
3.1、數值比較
比較 | 描述 |
n1 -eq n2 | 檢查n1和n2是否相等 |
n1 -ge n2 | 檢查n1是否大於等於n2 |
n1 -gt n2 | 檢查n1是否大於n2 |
n1 -le n2 | 檢查n1是否小於等於n2 |
n1 -lt n2 | 檢查n1是否小於n2 |
n1 -ne n2 | 檢查n1和n2是否不相等 |
3.2、字符串比較
比較 | 描述 |
str1 = str2 | 字符串是否相同 |
str1 != str2 | 字符串是否不相同 |
str1 < str2 | 字符串str1是否小於str2 |
str1 > str2 | 字符串str1是否大於str2 |
-n str1 | 檢查str1是否不爲空 |
-z str1 | 檢查str1是否爲空 |
注意:test命令 和測試表達式使用標準的數學比較符號表示字符串比較,而用文本代碼來表示數值比較。如果你對數值使用了數學運算符號,shell會將它們當成字符串值,可能無法得到正確的結果。
3.3、文件比較
[ -d FILE ] 如果 FILE 存在且是一個目錄則爲真。
[ -e FILE ] 如果 FILE 存在則爲真。
[ -f FILE ] 如果 FILE 存在且是一個普通文件則爲真。
[ -r FILE ] 如果 FILE 存在且是可讀的則爲真。
[ -s FILE ] 如果 FILE 存在且大小不爲0則爲真。
[ -w FILE ] 如果 FILE 如果 FILE 存在且是可寫的則爲真。
[ -x FILE ] 如果 FILE 存在且是可執行的則爲真。
[ -O FILE ] 如果 FILE 存在且屬有效用戶ID則爲真。
[ -G FILE ] 如果 FILE 存在且屬有效用戶組則爲真。
[ FILE1 -nt FILE2 ] 如果 FILE1 比 FILE2 要新,或者FILE1 存在且 FILE2 不存在則爲真。
[ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在則爲真。
[ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的設備和節點號則爲真。
4、if-then的高級特性
bash shell提供了兩項可在if-then語句中使用的高級特性:
用於數學表達式的雙括號;
用於高級字符串處理功能的雙方括號。
4.1、使用雙括號
格式: (( expression ))
除了使用標準的數學運算符,雙括號命令中用到的其它運算符號如下:
var++ 後增
var-- 後減
++var 先增
--var 先減
! 邏輯求反
~ 位求反
** 冪運算
<< 左位移
>> 右位移
& 按位與
| 按位或
&& 邏輯與
|| 邏輯或
可以在if語句中用雙括號命令,也可以在腳本中的普通命令裏使用來賦值。
案例1:
cat test.sh
#!/bin/bash
val=10
if (( $val ** 2 >90 ))
then
((val2=$val**2))
echo "the square of $val is $val2"
fi
輸出結果如下:
[root@localhost]# ./test.sh
the square of 10 is 100
注意:不需要將雙括號中表達式的大於號轉義,這是雙括號命令提供的另一個高級特性。
4.2、使用雙方括號
格式 : [[ expression ]]
雙方括號裏的expression使用了test命令中採用的標準字符串比較。但它提供了test命令爲提供的一個特性-模式匹配。
在模式匹配中,可以定義一個正則表達式來匹配字符串值。
案例2:
cat test2.sh
#!/bin/bash
if [[ $USER == r* ]]
then
echo "Hello $USER"
else
echo "sorry,i do not know you"
fi
輸出結果爲:
[root@localhost]# ./test2.sh
Hello root
在上面的腳本中,使用了雙等號,雙等號將右邊的字符串(r*)視爲一個模式,並應用模式匹配規則。
5、case命令
case variable in
pattern1|pattern2) commands1;;
pattern3) commands2;;
*) default commands;;
esac