bash if條件判斷的使用
在bash中,if是可以對(duì)語(yǔ)句做選擇執(zhí)行,做if條件測(cè)試有整數(shù)測(cè)試,字符測(cè)試,文件測(cè)試三種形式。
if格式
單分支語(yǔ)法
if 條件; then
語(yǔ)句1
語(yǔ)句2
...
fi
雙分支語(yǔ)法
if 條件;then
語(yǔ)句1
語(yǔ)句2
else
語(yǔ)句2
fi
多分支語(yǔ)法
if 條件1; then
語(yǔ)句1
語(yǔ)句2
elif 條件2; then
語(yǔ)句1
語(yǔ)句2
else
語(yǔ)句1
語(yǔ)句2
fi
條件測(cè)試
if的判斷條件具體可以有以下幾種形式
- [ express ]
- [[ express ]]
- test express
- bash命令(命令執(zhí)行成功則執(zhí)行語(yǔ)句)
[],[[]],test作用類(lèi)似,基本上在編寫(xiě)bash腳本時(shí)可以互換
注意:[],[[]]空格位置;
[1個(gè)空格+表達(dá)式+1個(gè)空格]
[[1個(gè)空格+表達(dá)式+1個(gè)空格]]
示例:bash命令做if條件
示例1:查看系統(tǒng)是否有hadoop用戶,如果有返回uid和shell,沒(méi)有返回no
[root@node1 bash_test]# cat 17.sh? #!/bin/bash if id -u hadoop &> /dev/null;then ? ? grep "^hadoop" /etc/passwd | cut -d: -f1,7 else ? ? echo no fi [root@node1 bash_test]# ./17.sh? hadoop:/bin/bash
注意:
- id -u hadoop &> /dev/null指令的作用是執(zhí)行id -u hadoop將其回執(zhí)丟掉(不在終端顯示)
- bash命令做if條件時(shí),當(dāng)命令狀態(tài)返回值為真即值為0時(shí),條件滿足:命令狀態(tài)返回值1-255即條件不滿足
命令狀態(tài)返回值
我們可以使用$?查看上一條命令的命令狀態(tài)返回值,命令成功執(zhí)行返回0,失敗執(zhí)行返回1
[root@node1 bash_test]# id hadoop uid=4024(hadoop) gid=4024(hadoop) 組=4024(hadoop),4026(mygrp) [root@node1 bash_test]# echo $? 0 [root@node1 bash_test]# id hadoop111 id: hadoop111: no such user [root@node1 bash_test]# echo $?
當(dāng)然在bash腳本中,我們可以使用exit退出程序時(shí),后面接的數(shù)字則代表命令執(zhí)行情況。例如:exit 0代表執(zhí)行成功,exit 1代表執(zhí)行失敗
整數(shù)測(cè)試
if條件測(cè)試是為了比較整數(shù)時(shí),具體規(guī)則如下
expression: 數(shù)值1 比較符號(hào) 數(shù)值2
比較符號(hào):
大于 -gt
大于或等于 -ge
等于 -eq
不等于 -ne
小于 -gt
小于或等于 -ge
示例1:讀取一個(gè)參數(shù),如果他小于10返回Yes,大于10返回No
[root@node1 bash_test]# cat 18.sh? #!/bin/bash if [ $1 -lt 10 ];then ? echo Yes else ? echo No fi [root@node1 bash_test]# ./18.sh 5 Yes [root@node1 bash_test]# ./18.sh 11 No
注意:$1代表終端傳入的第一個(gè)參數(shù)
bash中位置變量有:
$1,$2,$3…
$@ $* 顯示所有位置變量
$@ 五個(gè)字符串當(dāng)成一個(gè)字符串顯示
$* 五個(gè)字符串各自顯示
$# 顯示位置變量個(gè)數(shù)
$? 保存剛剛執(zhí)行命令的狀態(tài)返回值
shift 實(shí)現(xiàn)位置參數(shù)輪替
結(jié)合shfit可以使用一個(gè)$1可以得到所有的變量
shfit 2 指定輪替2個(gè)
例如:執(zhí)行命令./18.sh 5
$0為./18.sh
$1為5
@ 和 @和@和* 均為"./18.sh 5"
$#為1
示例2:寫(xiě)一個(gè)腳本隨機(jī)生成兩個(gè)數(shù),比較其大小
[root@node1 bash_test]# cat 19.sh? #!/bin/bash A=$RANDOM B=$RANDOM result="" if [ $A -lt $B ];then ? result="A is greater than B" elif [ $A -gt $B ];then ? result="A is less then B" else ? result="A equals B" fi echo "A = $A, B = $B, $result" [root@node1 bash_test]# ./19.sh? A = 6646, B = 3889, A is less then B
$RANDOM 生成隨機(jī)數(shù) 0-32767之間的數(shù)
字符測(cè)試
if條件為字符比較大小時(shí),默認(rèn)以ASCII碼表做大小比較
除了使用符號(hào)-lt,-gt,-le,-ge,-eq,-ne做判斷,我們也可以使用下述符號(hào)做判斷
> : 大于
< : 小于
== :等于
!= :不等于
單目測(cè)試
-z $STRING 字符串的長(zhǎng)度,為空則為真,非空為假
-n $STRING 為空則為假,不空則真
=~ 判斷左邊的字符串是否能夠被右邊的模式所匹配,通常用于雙[[ ]]中
一般用行首,行尾錨定$,不能用詞首詞尾錨定\< \>
不能用引號(hào)
一般我們用==比較多,用來(lái)判斷兩個(gè)字符串是否相等
示例1:寫(xiě)一個(gè)腳本,可以接受一個(gè)參數(shù),其使用形式如下所示:
script.sh {start|stop|restart|status}
其中:
如果參數(shù)為start,則創(chuàng)建空文件/var/lock/subsys/script,并顯示“starting script successfully.”
如果參數(shù)為stop,則刪除文件/var/lock/subsys/script,并顯示“Stop script successfully.”
如果參數(shù)為restart,則刪除文件/var/locksubsys/script并重新創(chuàng)建,而后顯示“Restarting script successfully.”
如果參數(shù)為status,那么:如果文件/var/lock/subsys/script存在,則顯示“Script is running…”,否則,則顯示“Script is stopped.”
其他任何參數(shù);則顯示“script.sh {start|stop|restart|status}”
#!/bin/bash
# echo $1
if [ $1 == "start" ];then
if [ -e /var/lock/subsys/script ];then
echo "script is already running."
else
mkdir /var/lock/subsys/script
echo "Starting script successfully."
fi
elif [ $1 == "stop" ];then
if [ -e /var/lock/subsys/script ];then
rm -rf /var/lock/subsys/script
echo "Stop script finished."
else
echo "script is stopped yet."
fi
elif [ $1 == "restart" ];then
rm -rf /var/lock/subsys/script
mkdir /var/lock/subsys/script
echo "Restarting script successfully."
elif [ $1 == "status" ];then
if [ -e /var/lock/subsys/script ];then
echo "script is running."
else
echo "script is stopped."
fi
else
echo "script.sh {start|stop|restart|status}"
fi文件測(cè)試
對(duì)文件進(jìn)行操作,主要有以下幾種
單目測(cè)試
-f 測(cè)試其是否為普通文件,即ls -l 時(shí)文件類(lèi)型為-的文件
-d 測(cè)試其是否為目錄文件,即ls -l 時(shí)文件類(lèi)型為-的目錄
-e 測(cè)試文件是否存在,存在為真
-r,-w,-x這三個(gè)都是判斷文件權(quán)限,是否有讀,寫(xiě),執(zhí)行權(quán)限
-s 測(cè)試文件大小是否不空,不空則真,空為假
-l -b -c這三個(gè)判斷文件是否為相應(yīng)類(lèi)型
示例:如果/tmp/test10不存在,則創(chuàng)建它
[root@node1 bash_test]# cat 21.sh? #!/bin/bash if [ ! -e /tmp/test10 ];then ? ? mkdir /tmp/test10 fi [root@node1 bash_test]# ls -ld /tmp/test10 ls: 無(wú)法訪問(wèn)/tmp/test10: 沒(méi)有那個(gè)文件或目錄 [root@node1 bash_test]# ./21.sh? [root@node1 bash_test]# ls -ld /tmp/test10 drwxr-xr-x 2 root root 6 8月 ? 1 21:21 /tmp/test10
組合條件測(cè)試
當(dāng)有多個(gè)判斷需要做時(shí),可以使用如下進(jìn)行連接
| 符號(hào) | 符號(hào)意義 | 示例 | 解釋 |
|---|---|---|---|
| -a | 與,符號(hào)左右兩邊都需要滿足; | [ $A > 300 -a $A < 500 ] | A變量值大于300,而且要小于500滿足條件 |
| -o | 或,符號(hào)左右兩邊只要滿足一個(gè); | [ $B < 10 -o $A > 100 ] | B變量小于10或者A變量小于100 |
| ! | 非,將結(jié)果取反; | [ ! id hadoop &> /dev/null ] | 如果沒(méi)有hadoop用戶則滿足條件 |
如果使用獨(dú)立命令做組合條件時(shí),使用與&&,||或,!非
示例1:寫(xiě)一個(gè)腳本,給定用戶,如果不存在退出腳本
[root@node1 bash_test]# cat 20.sh
#!/bin/bash
if ! id $1 > /dev/null;then
echo "no find this user"
exit 6
else
id $1
fi
[root@node1 bash_test]# ./20.sh hadoop
uid=4024(hadoop) gid=4024(hadoop) 組=4024(hadoop),4026(mygrp)
[root@node1 bash_test]# ./20.sh hadoop1
id: hadoop1: no such user
no find this user
示例2:通過(guò)參數(shù)傳-一個(gè)字符串給腳本,如果傳遞的字符串為“memory"或"Memory",就以MB為單位顯示當(dāng)前主機(jī)的內(nèi)存信息:否則,就顯示/proc/uptime文件的內(nèi)容。
#!/bin/bash if [[ $1 == "memory" || $1 == "Memory" ]]; then free -tm else cat /proc/uptime fi
注意:
|| 短路操作,前面為真,不會(huì)運(yùn)行后面
&& 前面為假,無(wú)需運(yùn)算后面
如果我們需要前面為假,運(yùn)行后面程序,使用||
如果我們需要前面為真,運(yùn)行后面程序,使用&&
示例1:如果/tmp/test10不存在,則創(chuàng)建它
[ -e /tmp/test10 ] || mkdir /tmp/test10
示例2:如果/tmp/test10文件夾存在,則在該文件夾下創(chuàng)建hello文件
[ -d /tmp/test10 ] && touch /tmp/test10/hello
示例3:如果/tmp/test10/hello文件存在,則顯示’exist’;不存在則顯示’not exist’
[ -f /tmp/test10/hello ] && echo "exist" || echo "not exist"
到此這篇關(guān)于bash if條件判斷的使用的文章就介紹到這了,更多相關(guān)bash if條件判斷內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Linux Shell 常見(jiàn)的命令行格式簡(jiǎn)明總結(jié)
這篇文章主要介紹了Linux Shell 常見(jiàn)的命令行格式簡(jiǎn)明總結(jié),非常實(shí)用,需要的朋友可以參考下2014-04-04
Shell腳本之進(jìn)制轉(zhuǎn)換器的實(shí)現(xiàn)
本文主要介紹了Shell腳本之進(jìn)制轉(zhuǎn)換器的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
shell實(shí)現(xiàn)FizzBuzzWhizz問(wèn)題示例(拉勾網(wǎng)面試題)
這篇文章主要介紹了shell實(shí)現(xiàn)FizzBuzzWhizz問(wèn)題示例(拉勾網(wǎng)面試題),需要的朋友可以參考下2014-05-05
Shell獲取字符串長(zhǎng)度的多種方法總結(jié)
這篇文章主要給大家總結(jié)分享了關(guān)于Shell獲取字符串長(zhǎng)度的多種方法,包括了利用${#str}、利用awk的length方法、利用awk的NF項(xiàng)、利用wc的-L參數(shù)、利用expr的length方法以及利用expr的$str : ".*"技巧來(lái)實(shí)現(xiàn)方法示例,需要的朋友可以參考下。2017-08-08
linux中編寫(xiě)自己的并發(fā)隊(duì)列類(lèi)(Queue 并發(fā)阻塞隊(duì)列)
這篇文章主要介紹了linux中編寫(xiě)并發(fā)隊(duì)列類(lèi),功能有:并發(fā)阻塞隊(duì)列、有超時(shí)限制、有大小限制2013-12-12

