六、shell腳本的條件測試與比較 (一)條件表達式的常見語法 1、條件表達式6種寫法(if,while) 語法1:test 語法2:[ ] 中括弧兩端必須要有空格 語法3:[[]] 兩端必須要有空格 語法4:((測試表達式)) 兩端必不需要空格 語法5:(命令表達式) 語法6: 實際應用展示 ①[ ...
六、shell腳本的條件測試與比較
(一)條件表達式的常見語法
1、條件表達式6種寫法(if,while)
語法1:test<測試表達式>
語法2:[ <測試表達式>] #中括弧兩端必須要有空格
語法3:[[<測試表達式>]] #兩端必須要有空格
語法4:((測試表達式)) #兩端必不需要空格
語法5:(命令表達式)
語法6:命令表達式
實際應用展示
①[]條件表達式
[root@centos6-kvm3 scripts]# [ -e /etc/hosts ] && echo 0 || echo 1
0
[root@centos6-kvm3 scripts]# [ -e /etc/host1 ] && echo 0 || echo 1
1
②test條件表達式:test和[]功能相同
[root@centos6-kvm3 scripts]# test -e /etc/host1 && echo 0 || echo 1
1
[root@centos6-kvm3 scripts]# test -e /etc/hosts && echo 0 || echo 1
0
[root@centos6-kvm3 scripts]# # [] == test
③[[]]雙中括弧條件表達式,兩邊需要空格
[root@centos6-kvm3 scripts]# [[ -e /etc/host1 ]] && echo 0 || echo 1
1
[root@centos6-kvm3 scripts]# [[ -e /etc/hosts ]] && echo 0 || echo 1
0
④雙括弧條件表達式,兩邊不需要空格
[root@centos6-kvm3 scripts]# (( -e /etc/hosts )) && echo 0 || echo 1
-bash: ((: -e /etc/hosts : division by 0 (error token is "/hosts ")
1
⑤雙括弧一般用於計算:
[root@centos6-kvm3 scripts]# ((3>5)) && echo 0 || echo 1
1
[root@centos6-kvm3 scripts]# ((3<5)) && echo 0 || echo 1
0
[root@centos6-kvm3 scripts]# #(())用於計算
⑥expr 表達式:使用括弧
[root@centos6-kvm3 scripts]# (expr 1 + 2 &>/dev/null) && echo 0 || echo 1
0
[root@centos6-kvm3 scripts]# (expr 1 + 2 &>/dev/null) && echo 0 || echo 1
0
[root@centos6-kvm3 scripts]# (expr 1 + a &>/dev/null) && echo 0 || echo 1
1
⑦expr 表達式:使用反引號
[root@centos6-kvm3 scripts]# `expr 1 + a &>/dev/null` && echo 0 || echo 1
1
[root@centos6-kvm3 scripts]# `expr 1 + 2 &>/dev/null` && echo 0 || echo 1
0
[root@centos6-kvm3 scripts]#
(二)條件表達式的編輯語法:
1、[<測試表達式>] && 命令1 ||命令2
如果前面表達式成功,那麼執行命令1,否則執行命令2
if [ <測試表達式>]
then
命令1
else
命令2
fi
2、多命令情況
當命令很多的時候,我們可以使用大括弧把所有命令括起來。如下:
[ <測試表達式> ] && {
命令1
命令2
}||{
命令3
命令4
}
3、只保留執行成功的
[ <測試表達式>] &&{
命令1
命令2
命令3
}
4、只保留執行失敗的
[<測試表達式>] || {
命令1
命令2
命令3
}
(三)文件測試表達式
man test
-d:文件為目錄且存在
[root@centos6-kvm3 scripts]# [ -d /etc/hosts ] && echo 0 || echo 1
1
[root@centos6-kvm3 scripts]# [ -d /etc ] && echo 0 || echo 1
0
-f:判斷為文件且存在
[root@centos6-kvm3 scripts]# [ -f /etc/hosts ] && echo 0 || echo 1
0
-e:判斷存在,為目錄或者文件
[root@centos6-kvm3 scripts]# [ -e /etc/hosts ] && echo 0 || echo 1
0
[root@centos6-kvm3 scripts]# [ -e /etc ] && echo 0 || echo 1
0
-r:判斷文件為可讀:
[root@centos6-kvm3 scripts]# [ -r /etc/hosts ] && echo 0 || echo 1
0
[root@centos6-kvm3 scripts]# ll /etc/hosts
-rw-r--r--. 2 root root 352 Nov 19 2018 /etc/hosts
-x:判斷文件為可執行:
[root@centos6-kvm3 scripts]# [ -x /etc/hosts ] && echo 0 || echo 1
1
[root@centos6-kvm3 scripts]# chmod +x /etc/hosts
[root@centos6-kvm3 scripts]# [ -x /etc/hosts ] && echo 0 || echo 1
0
-s:判斷文件大小不為0:
[root@centos6-kvm3 scripts]# [ -s /etc/hosts ] && echo 0 || echo 1
0
[root@centos6-kvm3 scripts]# touch oldboy.log
[root@centos6-kvm3 scripts]# [ -s oldboy.log ] && echo 0 || echo 1
1
應用示例:crond
[root@centos6-kvm3 scripts]# cat /etc/init.d/crond
(四)字元串測試表達式的常見功能說明
n:not zero ,[-n "字元串" ] 字元串長度不為0,表達式為真。
z:zero,[-z "字元串" ] 字元串長度為0,表達式為真。
["字元串1"==“字元串2”] 兩個字元串相同為真。
[“字元串1”!=“字元串2”] 兩個字元串不相同為真。
註意:
1、字元串就用雙引號。
2、等號可以用一個或者兩個。
3、等號兩端必須要有空格。
[root@centos6-kvm3 scripts]# [ -n "oldboy" ] && echo 1 || echo 0
1
[root@centos6-kvm3 scripts]# [ -z "oldboy" ] && echo 1 || echo 0
0
[root@centos6-kvm3 scripts]# char="oldboy"
[root@centos6-kvm3 scripts]# [ -n "$char" ] && echo 1 || echo 0
1
[root@centos6-kvm3 scripts]# unset char
[root@centos6-kvm3 scripts]# [ -n "$char" ] && echo 1 || echo 0
0
[root@centos6-kvm3 scripts]# [ "dd"=="ff" ] && echo 1 || echo 0
1
[root@centos6-kvm3 scripts]# [ "dd" == "ff" ] && echo 1 || echo 0
0
[root@centos6-kvm3 scripts]# [ "dd" == "dd" ] && echo 1 || echo 0
1
[root@centos6-kvm3 scripts]# [ "dd" != "ff" ] && echo 1 || echo 0
1
[root@centos6-kvm3 scripts]# [ "dd" != "dd" ] && echo 1 || echo 0
0
實例應用:
cat /etc/init.d/crond
cat /etc/init.d/network
實例:
[root@centos6-kvm3 scripts]# cat select1.sh
#!/bin/bash
cat << EOF
1.install lamp
2.install lnmp
3.exit
EOF
read -p "請輸入一個序號:" num
[ -z "$num" ] && exit 1 #判斷內容是否為空
expr 2 + $num &>/dev/null
if [ $? -ne 0 ]
then
echo "usage:$0{1|2|3}"
exit 1
fi
if [ $num -eq 1 ]
then
echo "install lamp..."
elif [ $num -eq 2 ]
then
echo "install lnmp ..."
elif [ $num -eq 3 ]
then
echo "bye..."
exit
else
echo "usage:$0{1|2|3}"
exit 1
fi
(五)整數測試表達式
在[]及test中使用的比較表達式 | 在(())和[[]]中使用的比較符號 | 說明 |
---|---|---|
-eq | ==或者= | 等於equal |
-ne | != | 不等於not equal |
-gt | > | 大於greater then |
-ge | >= | 大於等於greater equal |
-lt | < | 小於 less then |
-le | <= | 小於等於 less equal |
實例
[root@centos6-kvm3 ~]# [ 2 -eq 3 ] && echo 0 || echo 1
1
[root@centos6-kvm3 ~]# [ 2 -gt 3 ] && echo 0 || echo 1
1
[root@centos6-kvm3 ~]# [ 2 -lt 3 ] && echo 0 || echo 1
0
[root@centos6-kvm3 ~]# [ 2 > 3 ] && echo 0 || echo 1
0
[root@centos6-kvm3 ~]# [ 2 \> 3 ] && echo 0 || echo 1
1
[root@centos6-kvm3 ~]# [[ 2 > 3 ]] && echo 0 || echo 1
1
[root@centos6-kvm3 ~]# [[ 2 -gt 3 ]] && echo 0 || echo 1
1
[root@centos6-kvm3 ~]# [[ 2 -lt 3 ]] && echo 0 || echo 1
0
[root@centos6-kvm3 ~]# (( 2 -lt 3 )) && echo 0 || echo 1
-bash: ((: 2 -lt 3 : syntax error in expression (error token is "3 ")
1
[root@centos6-kvm3 ~]# (( 2 > 3 )) && echo 0 || echo 1
1
[root@centos6-kvm3 ~]# (( 2 < 3 )) && echo 0 || echo 1
0
[root@centos6-kvm3 ~]# test 2 -gt 3 && echo 0 || echo 1
1
[root@centos6-kvm3 ~]# test 2 -lt 3 && echo 0 || echo 1
0
總結:
1、雙中括弧中使用 字母表達式。
2、雙括弧中不適合字母表達式,只適合符號表達式。
3、test表達式只適合符號表達式。
(六)測試題:使用read的交互方式,來比較兩個整數的大小。
[root@centos6-kvm3 scripts]# cat test3.sh
#!/bin/bash
read -p "請輸入兩個整數:" a b
[ -z "$b" ] && {
echo "請輸入兩個整數。"
exit 1
}
expr $a + $b + 1 &>/dev/null
[ $? -ne 0 ] && {
echo "請輸入兩個整數。"
exit 2
}
[ $a -lt $b ] && {
echo "$a小於$b."
exit 0
}
[ $a -gt $b ] && {
echo "$a大於$b."
exit 0
}
[ $a -eq $b ] && {
echo "$a等於$b."
exit 0
}
================
使用if語句:
[root@centos6-kvm3 scripts]# cat test4.sh
#!/bin/bash
read -p "請輸入兩個整數:" a b
[ -z "$b" ] && {
echo "請輸入兩個整數。"
exit 1
}
expr $a + $b + 1 &>/dev/null
[ $? -ne 0 ] && {
echo "請輸入兩個整數。"
exit 2
}
if [ $a -lt $b ]
then
echo "$a小於$b."
elif [ $a -gt $b ]
then
echo "$a大於$b."
else
echo "$a等於$b."
fi
[root@centos6-kvm3 scripts]#
(七)邏輯測試表達式
在[]和test中使用操作符 | 在[[]]和(())中使用操作符 | 說明 |
---|---|---|
-a | && | and 與 |
-o | || | or 或 |
! | ! | not 非 |
實例:
[root@centos6-kvm3 scripts]# [ 1 -eq 1 -a -f /etc/hosts ] && echo 1 || echo 0
1
[root@centos6-kvm3 scripts]# [ 1 -eq 2 -a -f /etc/hosts ] && echo 1 || echo 0
0
[root@centos6-kvm3 scripts]# [ 1 -eq 2 -o -f /etc/hosts ] && echo 1 || echo 0
1
[root@centos6-kvm3 scripts]# [ 1 -eq 2 ] -o [ -f /etc/hosts ] && echo 1 || echo 0
-bash: [: too many arguments
0
[root@centos6-kvm3 scripts]# [ 1 -eq 2 ] || [ -f /etc/hosts ] && echo 1 || echo 0
1
[root@centos6-kvm3 scripts]# [ 1 -eq 2 ] && [ -f /etc/hosts ] && echo 1 || echo 0
0
[root@centos6-kvm3 scripts]# [[ 1 -eq 2 || -f /etc/hosts ]] && echo 1 || echo 0
1
[root@centos6-kvm3 scripts]# [[ 1 -eq 2 && -f /etc/hosts ]] && echo 1 || echo 0
0