生活随笔
收集整理的這篇文章主要介紹了
shell编程之条件判断语句和流程控制语句
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
shell條件判斷語(yǔ)句和流程控制語(yǔ)句
文章目錄 shell條件判斷語(yǔ)句和流程控制語(yǔ)句 一、條件判斷語(yǔ)法結(jié)構(gòu) 1. 條件判斷語(yǔ)法格式 2. 條件判斷相關(guān)參數(shù) 二、流程控制語(yǔ)句 1. 基本語(yǔ)法結(jié)構(gòu) 2. 應(yīng)用案例 3. 練習(xí)
一、條件判斷語(yǔ)法結(jié)構(gòu)
思考:何為真(true)?何為假(false)?
1. 條件判斷語(yǔ)法格式
格式1: test 條件表達(dá)式 格式2: [ 條件表達(dá)式 ] 格式3: [[ 條件表達(dá)式 ]] 支持正則 =~
特別說(shuō)明:
1)[ 親親,我兩邊都有空格,不空打死你呦 ] 👿 2)[[ 親親,我兩邊都有空格,不空打死你呦 ]]👿
更多判斷, man test 去查看,很多的參數(shù)都用來(lái)進(jìn)行條件判斷
2. 條件判斷相關(guān)參數(shù)
問(wèn):你要判斷什么? 答:我要判斷文件類型,判斷文件新舊,判斷字符串是否相等,判斷權(quán)限 等等…
㈠ 判斷文件類型
舉例說(shuō)明:
test -e
file 只要文件存在條件為真
[ -d /shell01/dir1
] 判斷目錄是否存在,存在條件為真
[ ! -d /shell01/dir1
] 判斷目錄是否存在,不存在條件為真
[ [ -f /shell01/1.sh
] ] 判斷文件是否存在,并且是一個(gè)普通的文件
㈡ 判斷文件權(quán)限
㈢ 判斷文件新舊 說(shuō)明:這里的新舊指的是文件的修改時(shí)間
㈣ 判斷整數(shù)
㈤ 判斷字符串 ㈥ 多重條件判斷 特別說(shuō)明:
&& 前面的表達(dá)式為真,才會(huì)執(zhí)行后面的代碼 || 前面的表達(dá)式為假,才會(huì)執(zhí)行后面的代碼 ; 只用于分割命令或表達(dá)式
① 舉例說(shuō)明
[ root@server ~
]
[ root@server ~
] $
[ $( id -u) -ne 0
] && echo "the user is not admin"
[ root@server ~
] $
[ $( id -u) -eq 0
] && echo "the user is admin" || echo "the user is not
admin"
[ root@server ~
]
[ root@server ~
]
this is admin
[ root@server ~
]
this is admin
[ root@server ~
]
this is admin
[ root@server ~
]
[ stu1@server ~
] $
[ $( id -u) -eq 0
] && echo this is admin
|| echo this is not admin
this is not admin
注意:在
(( )) 中,
= 表示賦值;
== 表示判斷
[ root@server ~
]
[ root@server ~
]
[ root@server ~
]
[ root@server ~
]
[ root@server ~
]
[ root@server ~
]
[ root@server ~
]
[ root@server ~
]
注意:雙引號(hào)引起來(lái),看作一個(gè)整體;
= 和
== 在
[ 字符串
] 比較中都表示判斷
[ root@server ~
]
[ root@server ~
]
[ root@server ~
]
[ root@server ~
]
[ root@server ~
]
[ root@server ~
]
[ root@server ~
]
test 表達(dá)式
[ 表達(dá)式
]
[ [ 表達(dá)式
] ]
思考:
[ ] 和
[ [ ] ] 有什么區(qū)別?
[ root@server ~
]
[ root@server ~
]
[ root@server ~
]
[ root@server ~
]
[ root@server ~
]
[ root@server ~
]
-bash:
[ :
: unary operator expected
2
[ [ '' = $a ] ] ; echo $?
0
[ root@server ~
]
[ root@server ~
]
[ root@server ~
]
② 邏輯運(yùn)算符總結(jié)
符號(hào);和&&和||都可以用來(lái)分割命令或者表達(dá)式 分號(hào)(;)完全不考慮前面的語(yǔ)句是否正確執(zhí)行,都會(huì)執(zhí)行;號(hào)后面的內(nèi)容 && 符號(hào),需要考慮&&前面的語(yǔ)句的正確性,前面語(yǔ)句正確執(zhí)行才會(huì)執(zhí)行&&后的內(nèi)容;反之亦然 || 符號(hào),需要考慮||前面的語(yǔ)句的非正確性,前面語(yǔ)句執(zhí)行錯(cuò)誤才會(huì)執(zhí)行||后內(nèi)容;反之亦然 如果&&和||一起出現(xiàn),從左往右依次看,按照以上原則
二、流程控制語(yǔ)句
1. 基本語(yǔ)法結(jié)構(gòu)
㈠ if結(jié)構(gòu)
箴言1:只要正確,就要一直向前沖?
if [ condition
] ; then command command
fi
if test 條件
; then 命令
fi
if [ [ 條件
] ] ; then 命令
fi [ 條件
] && command
㈡ if…else結(jié)構(gòu) 箴言2:分叉路口,二選一
if [ condition
] ; then command1
else command2
fi
[ 條件
] && command1
|| command2
小試牛刀: 讓用戶自己輸入字符串,如果用戶輸入的是hello,請(qǐng)打印world,否則打印“請(qǐng)輸入hello”
read定義變量 if…else…
1.
read -p
'請(qǐng)輸入一個(gè)字符串:' str
if [ "$str " = 'hello' ] ; then echo 'world'
else echo '請(qǐng)輸入hello!'
fi
2.
read -p
"請(qǐng)輸入一個(gè)字符串:" str
if [ "$str " = "hello" ]
then echo world
else echo "請(qǐng)輸入hello!" fi
echo "該腳本需要傳遞參數(shù)" if [ $1 = hello
] ; then echo "hello" else echo "請(qǐng)輸入hello" fi 3.
A
= hello
B
= world
C
= hello
if [ "$1 " = "$A " ] ; then echo "$B "
else echo "$C "
fi
read -p
'請(qǐng)輸入一個(gè)字符串:' str
;
[ "$str " = 'hello' ] && echo 'world' || echo '請(qǐng)輸入hello!'
㈢ if…elif…else結(jié)構(gòu) 箴言3:選擇很多,能走的只有一條
if [ condition1
] ; then command1 結(jié)束
elif [ condition2
] ; then command2 結(jié)束
else command3
fi
注釋:
如果條件1滿足,執(zhí)行命令1后結(jié)束;如果條件1不滿足,再看條件2,如果條件2滿足執(zhí)行命令2后結(jié)束;如果條件1和條件2都
不滿足執(zhí)行命令3結(jié)束.
㈣ 層層嵌套結(jié)構(gòu) 箴言4:多次判斷,帶你走出人生迷霧
if [ condition1
] ; then command1
if [ condition2
] ; then command2
fi else if [ condition3
] ; then command3
elif [ condition4
] ; then command4
else command5
fi
fi
注釋:
如果條件1滿足,執(zhí)行命令1;如果條件2也滿足執(zhí)行命令2,如果不滿足就只執(zhí)行命令1結(jié)束;
如果條件1不滿足,不看條件2;直接看條件3,如果條件3滿足執(zhí)行命令3;
如果不滿足則看條件4,如果條件4滿足執(zhí)行命令4;否則執(zhí)行命令5
2. 應(yīng)用案例
㈠ 判斷兩臺(tái)主機(jī)是否ping通
需求:判斷當(dāng)前主機(jī)是否和遠(yuǎn)程主機(jī)是否ping通 ① 思路
使用哪個(gè)命令實(shí)現(xiàn) ping -c次數(shù) 根據(jù)命令的執(zhí)行結(jié)果狀態(tài)來(lái)判斷是否通 $? 根據(jù)邏輯和語(yǔ)法結(jié)構(gòu)來(lái)編寫腳本(條件判斷或者流程控制) ② 落地實(shí)現(xiàn)
read -p
"請(qǐng)輸入你要ping的主機(jī)的IP:" ip
ping -c1
$ip & > /dev/null
if [ $? -eq 0
] ; then echo "當(dāng)前主機(jī)和遠(yuǎn)程主機(jī)$ip 是互通的"
else echo "當(dāng)前主機(jī)和遠(yuǎn)程主機(jī)$ip 不通的"
fi
邏輯運(yùn)算符
test $? -eq 0
&& echo "當(dāng)前主機(jī)和遠(yuǎn)程主機(jī)$ip 是互通的" || echo "當(dāng)前主機(jī)和遠(yuǎn)程主機(jī)$ip 不通的"
㈡ 判斷一個(gè)進(jìn)程是否存在 需求:判斷web服務(wù)器中httpd進(jìn)程是否存在 ① 思路
查看進(jìn)程的相關(guān)命令 ps pgrep 根據(jù)命令的返回狀態(tài)值來(lái)判斷進(jìn)程是否存在 根據(jù)邏輯用腳本語(yǔ)言實(shí)現(xiàn) ② 落地實(shí)現(xiàn)
pgrep httpd
& > /dev/null
if [ $? -ne 0
] ; then echo "當(dāng)前httpd進(jìn)程不存在"
else echo "當(dāng)前httpd進(jìn)程存在"
fi
或者
test $? -eq 0
&& echo "當(dāng)前httpd進(jìn)程存在" || echo "當(dāng)前httpd進(jìn)程不存在"
③ 補(bǔ)充命令
pgrep命令:以名稱為依據(jù)從運(yùn)行進(jìn)程隊(duì)列中查找進(jìn)程,并顯示查找到的進(jìn)程id
選項(xiàng)
- o:僅顯示找到的最小(起始)進(jìn)程號(hào)
;
- n:僅顯示找到的最大(結(jié)束)進(jìn)程號(hào);
- l:顯示進(jìn)程名稱;
- P:指定父進(jìn)程號(hào);pgrep
- p
4764 查看父進(jìn)程下的子進(jìn)程id
- g:指定進(jìn)程組;
- t:指定開(kāi)啟進(jìn)程的終端;
- u:指定進(jìn)程的有效用戶ID。
㈢ 判斷一個(gè)服務(wù)是否正常 需求:判斷門戶網(wǎng)站是否能夠正常訪問(wèn) ① 思路
可以判斷進(jìn)程是否存在,用/etc/init.d/httpd status判斷狀態(tài)等方法 最好的方法是直接去訪問(wèn)一下,通過(guò)訪問(wèn)成功和失敗的返回值來(lái)判斷
Linux環(huán)境,wget curl elinks -dump
② 落地實(shí)現(xiàn)
web_server
= www.itcast.cn
wget -P /shell/
$web_server & > /dev/null
[ $? -eq 0
] && echo "當(dāng)前網(wǎng)站服務(wù)是ok" && rm -f /shell/index.*
|| echo "當(dāng)前網(wǎng)站服務(wù)不ok,請(qǐng)立刻
處理"
3. 練習(xí)
㈠ 判斷用戶是否存在 需求1:輸入一個(gè)用戶,用腳本判斷該用戶是否存在
read -p
"請(qǐng)輸入一個(gè)用戶名:" user_name
id $user_name & > /dev/null
if [ $? -eq 0
] ; then echo "該用戶存在!"
else echo "用戶不存在!"
fi
read -p
"輸入壹個(gè)用戶:" id
id $id & > /dev/null
if [ $? -eq 0
] ; then echo "該用戶存在"
else echo "該用戶不存在"
fi
read -p
"請(qǐng)輸入你要查詢的用戶名:" username
grep -w
$username /etc/passwd
& > /dev/null
if [ $? -eq 0
]
then echo "該用戶已存在"
else echo "該用戶不存在"
fi
read -p
"請(qǐng)輸入你要檢查的用戶名:" name
id $name & > /dev/null
if [ $? -eq 0
]
then echo 用戶
"$name " 已經(jīng)存在
else echo 用戶
"$name " 不存在
fi
read -p
"請(qǐng)寫出用戶名" id
id $id
if [ $? -eq 0
] ; then echo "用戶存在"
else echo "用戶不存在"
fi
read -p
'請(qǐng)輸入用戶名:' username
id $username & > /dev/null
[ $? -eq 0
] && echo '用戶存在' || echo '不存在'
㈡判斷當(dāng)前主機(jī)的內(nèi)核版本
需求3:判斷當(dāng)前內(nèi)核主版本是否為2,且次版本是否大于等于6;如果都滿足則輸出當(dāng)前內(nèi)核版本
思路:
1. 先查看內(nèi)核的版本號(hào)
uname -r
2. 先將內(nèi)核的版本號(hào)保存到一個(gè)變量里,然后再根據(jù)需求截取出該變量的一部分:主版本和次版本
3. 根據(jù)需求進(jìn)步判斷
kernel
= ` uname -r`
var1
= ` echo $kernel| cut -d. -f1`
var2
= ` echo $kernel| cut -d. -f2`
test $var1 -eq 2 -a
$var2 -ge 6
&& echo $kernel || echo "當(dāng)前內(nèi)核版本不符合要求"
或者
[ $var1 -eq 2 -a
$var2 -ge 6
] && echo $kernel || echo "當(dāng)前內(nèi)核版本不符合要求"
或者
[ [ $var1 -eq 2
&& $var2 -ge 6
] ] && echo $kernel || echo "當(dāng)前內(nèi)核版本不符合要求" 或者
kernel
= ` uname -r`
test ${kernel:0:1} -eq 2 -a
${kernel:2:1} -ge 6
&& echo $kernel || echo '不符合要求'
其他命令參考:
uname -r
| grep ^2.
[ 6-9
] || echo '不符合要求'
總結(jié)
以上是生活随笔 為你收集整理的shell编程之条件判断语句和流程控制语句 的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。