1、條件測(cè)試表達(dá)式
1.1 shell的條件測(cè)試
條件測(cè)試,作用是驗(yàn)證條件是否符合預(yù)期骨坑。以下是常用語(yǔ)法
針對(duì)以上表有幾個(gè)注意事項(xiàng)需要說(shuō)明:
語(yǔ)法1中的test命令和語(yǔ)法2中的[]是等價(jià)的共屈。語(yǔ)法3中的[[]]為擴(kuò)展的test命令,語(yǔ)法4中的(())命令常用于計(jì)算今瀑,建議在生產(chǎn)環(huán)境中使用相對(duì)友好的語(yǔ)法2程梦,即中括號(hào)[]的語(yǔ)法
在雙中括號(hào)[[]]中可以使用通配符(如*)等進(jìn)行模式匹配,這是區(qū)別于其他幾種語(yǔ)法的地方
&&橘荠、||屿附、>、<等操作符可以應(yīng)用到[[]]中哥童,但不能應(yīng)用于[]中挺份,在[]中一般用-a、-o贮懈、-gt匀泊、-lt取代
對(duì)于整數(shù)的關(guān)系運(yùn)算,也可以使用Shell的算術(shù)運(yùn)算符(())
條件測(cè)試簡(jiǎn)單語(yǔ)法示例
-
test條件測(cè)試語(yǔ)句示例
-
[]條件測(cè)試語(yǔ)句示例
特殊的條件測(cè)試表達(dá)式語(yǔ)句朵你,可以執(zhí)行多個(gè)命令
[ 條件1 ] && {
命令1
命令2
...
}
[[ 條件1 ]] && {
命令1
命令2
...
}
test 條件1 && {
命令1
命令2
...
}
1.2 文件測(cè)試表達(dá)式
練習(xí):以腳本傳參和read讀入的方式輸入兩個(gè)文件路徑各聘,任意一個(gè)文件不存在,則提示用戶(hù)第幾個(gè)文件不存在抡医,并退出腳本
[root@shell-project /server/scripts]# cat tiaojian.sh
#!/bin/bash
read -p "請(qǐng)輸入兩個(gè)文件名稱(chēng): " vars1 vars2
[ -f "$vars1" ]&&{
echo $vars1
} ||{
echo "第一個(gè)文件不存在"
exit
}
[ -f "$vars2" ]&&{
echo $vars2
} ||{
echo "第二個(gè)文件不存在"
exit
}
[root@shell-project /server/scripts]# sh tiaojian.sh
請(qǐng)輸入兩個(gè)文件名稱(chēng): aa.txt test.sh
第一個(gè)文件不存在
1.3 字符串測(cè)試表達(dá)式
字符串測(cè)試表達(dá)式的作用:比較兩個(gè)字符是否相同躲因、測(cè)試字符串的長(zhǎng)度是否為0、字符串是否為NULL等魂拦,常用的字符串操作符如下所示:
注意:對(duì)于字符串測(cè)試的時(shí)候毛仪,一定要把字符串加雙引號(hào)
作業(yè):
在“在使用腳本傳參的方式實(shí)現(xiàn)整數(shù)的加、減芯勘、乘箱靴、除、取余荷愕、冪運(yùn)算”此作業(yè)的基礎(chǔ)上衡怀,對(duì)傳入的參數(shù)或者read讀入的變量?jī)?nèi)容進(jìn)行判斷,如果不符合計(jì)算條件安疗,提示用戶(hù)抛杨,并退出,不要用if判斷
分析:
1>傳入的參數(shù)個(gè)數(shù)必須為兩個(gè)
2>傳入的兩個(gè)參數(shù)必須為整數(shù)
3>在除法中荐类,除數(shù)不能為0
[root@shelledu /server/scripts]# cat jisuanqi.sh
#!/bin/bash
read -p "請(qǐng)輸入需要計(jì)算的內(nèi)容: " m n
# 判斷傳參是否為整數(shù)
expr $m + $n + 1 &> /dev/null
[ "$?" != "0" ] && {
echo "參數(shù)必須為整數(shù)"
exit 2
}
echo -n "$m+$n="; echo $(($m+$n))
echo -n "$m-$n="; echo $(($m-$n))
echo -n "$m*$n="; echo $(($m*$n))
echo -n '冪運(yùn)算: '; echo $(($m**$n))
# 判斷除數(shù)是否為0
[ "$n" = "0" ] && {
echo "除數(shù)必須不能為02老帧!!"
exit 3
}
echo -n "$m/$n="; echo $(($m/$n))
echo -n "$m%$n="; echo $(($m%$n))
[root@shelledu /server/scripts]# sh jisuanqi.sh
請(qǐng)輸入需要計(jì)算的內(nèi)容: 20 5
20+5=25
20-5=15
20*5=100
冪運(yùn)算: 3200000
20/5=4
20%5=0
[root@shelledu /server/scripts]#
1.4 整數(shù)二元比較操作符
注意:不推薦使用[[]]比較數(shù)字屈嗤,因?yàn)樵诖笮”容^中潘拨,[[]]比較的是字符串的arscII碼
有關(guān)[]、[[]]饶号、(())用法小結(jié):
- 整數(shù)加雙引號(hào)比較也可以
- [[]]中使用類(lèi)似-eq的寫(xiě)法是正確的铁追,而[[]]中用類(lèi)似>、<的寫(xiě)法也可能不對(duì)茫船,有可能值比較第一位琅束,原因在于arscII碼的特殊性
- [[]]中用類(lèi)似>、<的寫(xiě)法語(yǔ)法沒(méi)錯(cuò)(經(jīng)過(guò)轉(zhuǎn)義)算谈,但是邏輯結(jié)果不對(duì)涩禀,使用=、!=可以正確比較
- (())中不能使用類(lèi)似-eq的寫(xiě)法濒生,可以使用類(lèi)似>埋泵、<、==(=不可以)的寫(xiě)法
推薦:在比較數(shù)字的時(shí)候推薦使用[]和-gt罪治、-lt等類(lèi)似的搭配丽声,或者使用(())和>、<等搭配
1.4.1 小練習(xí):
1>查看當(dāng)前磁盤(pán)/當(dāng)前狀態(tài)觉义,如果使用率超過(guò)3%雁社,則觸發(fā)報(bào)警發(fā)郵件
[root@shelledu /server/scripts]# cat test3-4-1-1.sh
#!/bin/bash
#查看當(dāng)前磁盤(pán)/當(dāng)前狀態(tài),如果使用率超過(guò)11%晒骇,則觸發(fā)報(bào)警發(fā)郵件
sda_bf=`df -h |awk 'NR==2{print $5}'`
sda=${sda_bf%\%*}
[ $sda -gt 11 ]&&{
echo $sda_bf
echo '當(dāng)前磁盤(pán)的使用率已超過(guò)11%.'| mail -s '磁盤(pán)不足' wwjsqflymail@163.com
exit 0
}
[root@shelledu /server/scripts]# sh test3-4-1-1.sh
12%
[root@shelledu /server/scripts]#
2>查看內(nèi)存使用狀況霉撵,如果占用超過(guò)10%,則觸發(fā)報(bào)警
[root@shelledu /server/scripts]# cat test3-4-1-2.sh
#!/bin/bash
#查看內(nèi)存使用狀況洪囤,如果占用超過(guò)5%徒坡,則觸發(fā)報(bào)警
#total_mem=`free |awk 'NR==2{print $2}'`
#used_mem=`free |awk 'NR==2{print $3}'`
#bfb=`echo "scale=2;$used_mem/$total_mem*100"|bc`
bfb=`free |awk 'NR==2{print $3/$2*100}'`
sub_bfb=${bfb%.*}
echo $sub_bfb
[ $sub_bfb -gt 5 ]&&{
echo '內(nèi)存使用率已超過(guò)5%'|mail -s '內(nèi)存快滿了' wwjsqflymail@163.com
}
[root@shelledu /server/scripts]# dd if=/dev/zero of=/tmp/aaa.txt bs=100M count=100 #模擬環(huán)境
[root@shelledu /server/scripts]# sh test3-4-1-2.sh
10
[root@shelledu /server/scripts]#
1.5 邏輯操作符
小練習(xí):
1>輸入或者通過(guò)命令傳入一個(gè)字符或者數(shù)字,如果傳入的數(shù)字等于1就打印1瘤缩,如果等于2就打印2喇完;如果不等于1也不等于2,就提示輸入不對(duì)剥啤,然后退出程序锦溪。(兩種比較方式任選其一:數(shù)字比較或字符串比較)
[root@shell-project /server/scripts]# cat test04.sh
#!/bin/bash
#輸入或者通過(guò)命令傳入一個(gè)字符或者數(shù)字,如果傳入的數(shù)字等于1就打印1府怯,如果等于2就打印2刻诊;如果不等于1也不等于2,就提示輸入不對(duì)牺丙,然后退出程序则涯。(兩種比較方式任選其一:數(shù)字比較或字符串比較)
read -p "請(qǐng)輸入內(nèi)容: " num
[ "$num" = "1" -o "$num" = "2" ]&&{
echo $num
}||{
echo '抱歉,輸入的內(nèi)容不對(duì)!K谂小肖揣!'
exit
}
[root@shell-project /server/scripts]# sh test04.sh
請(qǐng)輸入內(nèi)容: 2
2
[root@shell-project /server/scripts]# sh test04.sh
請(qǐng)輸入內(nèi)容: 1
1
[root@shell-project /server/scripts]# sh test04.sh
請(qǐng)輸入內(nèi)容: er
抱歉,輸入的內(nèi)容不對(duì)8∪搿!羊异!
2>開(kāi)發(fā)shell腳本事秀,分別以腳本傳參方式和read讀入方式比較兩個(gè)整數(shù)大小,用條件表達(dá)式(禁止if)進(jìn)行判斷并以屏幕輸出的方式提醒用戶(hù)比較結(jié)果野舶。(一共需要開(kāi)發(fā)2個(gè)腳本易迹,在傳參和read讀入方式實(shí)現(xiàn)時(shí),需要對(duì)變量是否為數(shù)字及傳參個(gè)數(shù)是否正確給予提示)
分析:
- 判斷是否是兩個(gè)參數(shù)平道,(通過(guò)read不需要判斷)
- 判斷是否為整數(shù)(使用expr計(jì)算睹欲,出返回值,判斷返回值$?是否是0)
- 比較大小一屋,分為三個(gè)階段:大于窘疮、等于、小于
\\方法一:通過(guò)傳參的方式
[root@shell-project /server/scripts]# cat test06.sh
#!/bin/bash
#開(kāi)發(fā)shell腳本冀墨,分別以腳本傳參方式和read讀入方式比較兩個(gè)整數(shù)大小闸衫,用條件表達(dá)式(禁止if)進(jìn)行判斷并以屏幕輸出的方式提醒用戶(hù)比較結(jié)果。(一共需要開(kāi)發(fā)2個(gè)腳本诽嘉,在傳參和read讀入方式實(shí)現(xiàn)時(shí)蔚出,需要對(duì)變量是否為數(shù)字及傳參個(gè)數(shù)是否正確給予提示)
[ $# -ne 2 ]&&{
echo '必須輸入兩個(gè)參數(shù)!'
exit
}
expr $1 + $2 >/dev/null 2>&1
[ $? -ne 0 ]&&{
echo '輸入的參數(shù)必須是整數(shù)虫腋!'
exit
}
[ $1 -gt $2 ]&&{
echo "$1大于$2"
}
[ $1 -eq $2 ]&&{
echo "$1等于$2"
}
[ $1 -lt $2 ]&&{
echo "$1小于$2"
}
[root@shell-project /server/scripts]# sh test06.sh 2 f
輸入的參數(shù)必須是整數(shù)骄酗!
[root@shell-project /server/scripts]# sh test06.sh 2 3
2小于3
[root@shell-project /server/scripts]# sh test06.sh 4 3
4大于3
[root@shell-project /server/scripts]# sh test06.sh 4 4
4等于4
[root@shell-project /server/scripts]#
\\方法二:通過(guò)read
[root@shell-project /server/scripts]# cat test06-read.sh
#!/bin/bash
#開(kāi)發(fā)shell腳本,分別以腳本傳參方式和read讀入方式比較兩個(gè)整數(shù)大小悦冀,用條件表達(dá)式(禁止if)進(jìn)行判斷并以屏幕輸出的方式提醒用戶(hù)比較結(jié)果趋翻。(一共需要開(kāi)發(fā)2個(gè)腳本,在傳參和read讀入方式實(shí)現(xiàn)時(shí)雏门,需要對(duì)變量是否為數(shù)字及傳參個(gè)數(shù)是否正確給予提示)
read -p '請(qǐng)輸入要比較的兩個(gè)參數(shù):' n m
expr $n + $m >/dev/null 2>&1
[ $? -ne 0 ]&&{
echo '輸入的參數(shù)必須是整數(shù)嘿歌!'
exit
}
[ $n -gt $m ]&&{
echo "$n大于$m"
}
[ $n -eq $m ]&&{
echo "$n等于$m"
}
[ $n -lt $m ]&&{
echo "$n小于$m"
}
[root@shell-project /server/scripts]#
3>打印菜單,按照選擇項(xiàng)選擇你喜歡的美女
示例菜單:
1.heijiajia
2.gaoyuanyuan
3.caixukun
please input the num you like:
要求:
1)當(dāng)用戶(hù)輸入1時(shí)茁影,輸出“I guess you like heijiajia”宙帝,然后退出腳本
2)當(dāng)用戶(hù)輸入非1-3的字符時(shí),輸出“I guess you are not man”,然后退出腳本
[root@shell-project /server/scripts]# cat test05.sh
#!/bin/bash
#打印菜單募闲,按照選擇項(xiàng)選擇你喜歡的美女
cat <<EOF
1.heijiajia
2.gaoyuanyuan
3.caixukun
EOF
read -p "please input the num you like: " num
[ $num -eq 1 -o $num -eq 2 -o $num -eq 3 ]&&{
[ $num -eq 1 ]&&{
echo 'I guess you like heijiajia!'
exit 0
}
[ $num -eq 2 ]&&{
echo 'I guess you like gaoyuanyuan!'
exit 0
}
[ $num -eq 3 ]&&{
echo 'I guess you like caixukun!'
exit 0
}
}||{
echo 'I guess you are not man!'
exit 2
}
[root@shell-project /server/scripts]# sh test05.sh
1.heijiajia
2.gaoyuanyuan
3.caixukun
please input the num you like: 1
I guess you like heijiajia!
[root@shell-project /server/scripts]# sh test05.sh
1.heijiajia
2.gaoyuanyuan
3.caixukun
please input the num you like: 4
I guess you are not man!
1.6 案例實(shí)操
1.6.1 檢查OSPF route-ID配置步脓,配置如下,請(qǐng)用shell編寫(xiě)代碼,條件如下:
1靴患、 檢查ospf的route-id值
2仍侥、 route-id值必須與interface LoopBack0的IP地址值相同
grep -A 1 "interface LoopBack0" 3.txt | sed -n '3}
3、 如果兩個(gè)值不相等鸳君,或ospf的route-id值不以139開(kāi)頭农渊,則打印出route-id的值
/server/txt/ospf.txt
ofpf 100
route-id 139.11.0.1
area 0.0.0.0
network 139.11.0.1 0.0.0.0
network 140.11.0.0 0.0.0.3
network 140.11.0.8 0.0.0.3
network 140.11.0.16 0.0.0.3
network 140.11.0.24 0.0.0.3
network 140.11.0.32 0.0.0.3
#
interface LoopBack0
ip address 139.11.0.1 255.255.255.255
#
思路:
1> 取出route-id的ip值IP1
2> 取出interface LoopBack0的ip值IP2
3> [[ ! $IP! = ~ ^139]]
[root@shell-project /server/scripts]# cat test07.sh
#!/bin/bash
#檢查ospf的route-id值
route_id=`awk 'NR==2{print $2}' /server/txt/ospf.txt`
loop_ip=`grep -A 1 'interface LoopBack0' /server/txt/ospf.txt |awk 'NR==2{print $3}'`
#如果兩個(gè)值不相等,或ospf的route-id值不以139開(kāi)頭或颊,則打印出route-id的值
route_head=${route_id%%.*}
[ "$route_id" != "$loop_ip" -o $route_head -ne 139 ]&&{
echo ${route_id}
}|| {
echo 'route-id值與interface LoopBack0的IP地址值相同'
}
[root@shell-project /server/scripts]# sh test07.sh
route-id值與interface LoopBack0的IP地址值相同
1.6.2 處理以下文件內(nèi)容砸紊,將域名提取并進(jìn)行計(jì)數(shù)排序,如處理:
/server/txt/yuming.txt
http://www.baidu.com/index.html
http://www.baidu.com/1.html
http://post.baidu.com/index.html
http://mp3.baidu.com/index.html
http://www.baidu.com/3.html
http://post.baidu.com/2.html
得到如下結(jié)果:
域名的出現(xiàn)次數(shù) 域名
3 www.baidu.com
2 post.baidu.com
1 mp3.baidu.com
思路:
1> sds
2> history |cut -c 8-|sort |uniq -c|sort -rn|head
3> 排序公式囱挑,必須要會(huì)W硗纭!平挑!
sort |uniq -c|sort -rn
[root@shell-project /server/scripts]# cat test09.sh
#!/bin/bash
#處理以下文件內(nèi)容游添,將域名提取并進(jìn)行計(jì)數(shù)排序
awk -F'/' '{print $3}' /server/txt/yuming.txt |awk '{a[$0]++}END{for(i in a)print a[i],i}'|sort -rn|sed '1i域名的出現(xiàn)次數(shù) 域名'
[root@shell-project /server/scripts]# sh test09.sh
域名的出現(xiàn)次數(shù) 域名
3 www.baidu.com
2 post.baidu.com
1 mp3.baidu.com
[root@shell-project /server/scripts]#
1.6.3 打印菜單,按照選擇項(xiàng)一鍵安裝不同的web服務(wù)
示例菜單:
1.[install lnmp]
2.[install lamp]
3.[exit]
please input the num you want:
要求:
1)當(dāng)用戶(hù)輸入1時(shí)通熄,輸出“start installing lamp提示”唆涝,然后執(zhí)行/server/scripts/lamp.sh,(執(zhí)行方式使用全路徑方式執(zhí)行)。腳本內(nèi)容輸出“l(fā)amp is installed”并退出腳本棠隐,此為工作中的一鍵安裝lamp腳本
2)當(dāng)用戶(hù)輸入2時(shí)石抡,輸出“start installing lnmp提示”,然后執(zhí)行/server/scripts/lnmp.sh, (執(zhí)行方式使用全路徑方式執(zhí)行)助泽。腳本內(nèi)容輸出“l(fā)nmp is installed”并退出腳本啰扛,此為工作中的一鍵安裝lnmp腳本
3)當(dāng)輸出3時(shí),退出當(dāng)前菜單及腳本
4)當(dāng)用戶(hù)輸入非1-3的字符時(shí)嗡贺,輸出“Input Error”,然后退出腳本
5)對(duì)執(zhí)行的腳本進(jìn)行相關(guān)的條件判斷隐解,例如:腳本是否存在,是否可執(zhí)行等操作诫睬,盡量使用今天講的知識(shí)點(diǎn)
[root@shell-project /server/scripts]# cat lamp.sh
#!/bin/bash
sleep 2
echo 'lamp is installed! '
[root@shell-project /server/scripts]# cat lnmp.sh
#!/bin/bash
sleep 2
echo 'lnmp is installed! '
[root@shell-project /server/scripts]#
[root@shell-project /server/scripts]# cat test08.sh
#!/bin/bash
#定義變量
lamp="/server/scripts/lamp.sh"
lnmp="/server/scripts/lnmp.sh"
#打印菜單
cat << EOF
1.[install lamp]
2.[install lnmp]
3.[exit]
EOF
#使用read讀取輸入
read -p 'please input the num you want: ' num
#由于數(shù)字比較方式輸入英文的時(shí)候會(huì)報(bào)錯(cuò)煞茫,所以這里用字符串比較方式
[ "$num" = "1" -o "$num" = "2" -o "$num" = "3" ]&&{
[ "$num" = "1" ]&&{
echo 'start installing lamp……'
[ -f "$lamp" ]&&{
[ ! -x "$lamp" ]&&{
echo "$lamp沒(méi)有執(zhí)行權(quán)限,不可執(zhí)行"
exit 1
}
$lamp
exit 0
}||{
echo "error: $lamp is not exist."
exit 1
}
}
[ "$num" = "2" ]&&{
echo 'start installing lnmp……'
[ -f "$lnmp" ]&&{
[ ! -x "$lnmp" ]&&{
echo "$lnmp沒(méi)有執(zhí)行權(quán)限,不可執(zhí)行"
exit 1
}
$lnmp
exit 0
}||{
echo "error: $lnmp is not exist."
exit 1
}
}
[ "$num" = "3" ]&&{
echo 'good byb!'
exit 0
}
}||{
echo 'Input Error'
exit 1
}
[root@shell-project /server/scripts]#
[root@shell-project /server/scripts]# sh test08.sh
1.[install lamp]
2.[install lnmp]
3.[exit]
please input the num you want: 1
start installing lamp……
lamp is installed!
[root@shell-project /server/scripts]#