Shell腳本中條件判斷的原理與使用教學(xué)

無(wú)論什么編程語(yǔ)言都離不開(kāi)條件判斷(流控);
1.Shell條件測(cè)試
1.1 數(shù)值比較
[ 整數(shù)1 操作符 整數(shù)2 ] [ -gt ] # 大于 [ -lt ] # 小于 [ -eq ] # 等于 [ -ne ] # 不等于 [ -ge ] # 大于等于 [ -le ] # 小于等于
1.2 測(cè)試語(yǔ)法
test 條件表達(dá)式 [ 條件表達(dá)式 ] [[ 條件表達(dá)式 ]]
1.3 文件測(cè)試
-f # 路徑是否存在 -b # 路徑是否是塊設(shè)備文件 -d # 路徑是否是目錄 -h/-L # 路徑是否為連接文件 ......
示例
[root@shell-test ~]# vim Test-1.sh #!/bin/bash read -p "請(qǐng)輸入你要進(jìn)行檢測(cè)的目錄:" path if [ -d $path ] then echo "$path存在,不需要?jiǎng)?chuàng)建。" else echo "警告:$path不存在,請(qǐng)開(kāi)始創(chuàng)建。" fi [root@shell-test ~]# chmod +x Test-1.sh [root@shell-test ~]# ./Test-1.sh 請(qǐng)輸入你要進(jìn)行檢測(cè)的目錄:/etc/test 警告:/etc/test不存在,請(qǐng)開(kāi)始創(chuàng)建。 [root@shell-test ~]# ./Test-1.sh 請(qǐng)輸入你要進(jìn)行檢測(cè)的目錄:/mnt /mnt存在,不需要?jiǎng)?chuàng)建。
1.4 字符串比較
[ "字符串" = "字符串"] [ "字符串" != "字符串"]
示例
1.=示例
[root@shell-test ~]# vim Test-2.sh #!/bin/bash read -p "先生,請(qǐng)問(wèn)您需要辦卡么,今天是史上最大的一次打折!(yes/no): " input if [ "$input" = "yes" ] then echo "哈哈哈哈哈哈哈,大佬,謝謝支持小弟的工作!" else echo "哈哈哈,確實(shí)掙錢(qián)不容易,您要是有想法了,可以找我了,您慢走。" fi [root@shell-test ~]# chmod +x Test-2.sh [root@shell-test ~]# ./Test-2.sh 先生,請(qǐng)問(wèn)您需要辦卡么,今天是史上最大的一次打折!(yes/no): yes 哈哈哈哈哈哈哈,大佬,謝謝支持小弟的工作! [root@shell-test ~]# ./Test-2.sh 先生,請(qǐng)問(wèn)您需要辦卡么,今天是史上最大的一次打折!(yes/no): no 哈哈哈,確實(shí)掙錢(qián)不容易,您要是有想法了,可以找我了,您慢走。
2.!=示例
[root@shell-test ~]# vim Test-2.sh #!/bin/bash read -p "先生,請(qǐng)問(wèn)您需要辦卡么,今天是史上最大的一次打折!(yes/no): " input if [ "$input" != "no" ] then echo "哈哈哈哈哈哈哈,大佬,謝謝支持小弟的工作!" else echo "哈哈哈,確實(shí)掙錢(qián)不容易,您要是有想法了,可以找我了,您慢走。" fi [root@shell-test ~]# chmod +x Test-2.sh [root@shell-test ~]# ./Test-2.sh 先生,請(qǐng)問(wèn)您需要辦卡么,今天是史上最大的一次打折!(yes/no): yes 哈哈哈哈哈哈哈,大佬,謝謝支持小弟的工作! [root@shell-test ~]# ./Test-2.sh 先生,請(qǐng)問(wèn)您需要辦卡么,今天是史上最大的一次打折!(yes/no): no 哈哈哈,確實(shí)掙錢(qián)不容易,您要是有想法了,可以找我了,您慢走。
1.5and與or
當(dāng)條件測(cè)試比較復(fù)雜時(shí),需要多個(gè)條件同時(shí)成立,就需要混合條件測(cè)試了。
&& -a 兩個(gè)條件同時(shí)成立時(shí),為真。 || -o 兩個(gè)條件一個(gè)成立,即為真。
[root@shell-test ~]# vim Test-3.sh
echo "
新密碼要求:
1.長(zhǎng)度大于等于7位
2.包含字母大寫(xiě)
3.包含字母小寫(xiě)
4.包含符號(hào)“@!_”
"
read -p "請(qǐng)您輸入新密碼: " pass
if [ ${#pass} -ge 7 ] && [[ ${pass} =~ [a-z] ]] && [[ ${pass} =~ [A-Z] ]] && [[ ${pass} =~ [@_!] ]]
then echo "您的密碼真復(fù)雜?。。?
else echo "您的密碼太簡(jiǎn)單?。。?
fi
[root@shell-test ~]# chmod +x Test-3.sh
[root@shell-test ~]# ./Test-3.sh
新密碼要求:
1.長(zhǎng)度大于等于7位
2.包含字母大寫(xiě)
3.包含字母小寫(xiě)
4.包含符號(hào)“@!_”
請(qǐng)您輸入新密碼: Admin@123
您的密碼真復(fù)雜?。?!
2.流程控制if
2.1 單分支結(jié)構(gòu)
語(yǔ)法
if [ 條件測(cè)試 ] ;then fi
示例
需求:
用戶輸入用戶名,如果用戶不存在,則創(chuàng)建該用戶。
[root@shell-test ~]# vim test.sh
#!/bin/bash
echo '$$$$ User_Add $$$$'
read -p "請(qǐng)輸入你要新建的用戶:" user
id $user &> /dev/null
if [ $? -ne 0 ]
then
useradd $user
echo "$user已創(chuàng)建!"
fi
[root@shell-test ~]# chmod +x test.sh
[root@shell-test ~]# ./test.sh
$$$$ User_Add $$$$
請(qǐng)輸入你要新建的用戶:oop
oop已創(chuàng)建!
2.2 雙分支結(jié)構(gòu)
語(yǔ)法
if 條件測(cè)試 then 命令序列 else 命令序列 fi
示例
[root@shell-test ~]# vim test.sh
#!/bin/bash
echo '$$$$ User_Add $$$$'
read -p "新建用戶名:" user
id $user &> /dev/null
if [ $? -ne 0 ]
then
useradd $user
echo "123456" | passwd --stdin $user &> /dev/null
echo
id $user
echo "$user已創(chuàng)建,默認(rèn)密碼為:123456,請(qǐng)及時(shí)修改。"
else
id $user
echo
echo "此用戶已存在,不需要?jiǎng)?chuàng)建。"
fi
[root@shell-test ~]# chmod +x test.sh
[root@shell-test ~]# ./test.sh
$$$$ User_Add $$$$
新建用戶名:ok
uid=1008(ok) gid=1008(ok) groups=1008(ok)
ok已創(chuàng)建,默認(rèn)密碼為:123456,請(qǐng)及時(shí)修改。
[root@shell-test ~]# ./test.sh
$$$$ User_Add $$$$
新建用戶名:ok
uid=1008(ok) gid=1008(ok) groups=1008(ok)
此用戶已存在,不需要?jiǎng)?chuàng)建。
2.3 多分支結(jié)構(gòu)
語(yǔ)法
多分支結(jié)構(gòu) if 條件測(cè)試1 then 命令序列 elif 條件測(cè)試2 then 命令序列 elif 條件測(cè)試3 then 命令序列... else 命令序列 fi
示例
[root@shell-test ~]# vim time_Warn.sh
#!/bin/bash
echo "##判斷系統(tǒng)時(shí)間##"
hour=`date +%H`
time=`date +%H:%M:%S`
echo "$time是您當(dāng)前時(shí)間..."
echo
if [[ $hour -ge 6 && $hour -lt 10 ]]
then
echo "早晨時(shí)間,喝杯咖啡,運(yùn)動(dòng)一下吧!"
elif [[ $hour -ge 10 && $hour -lt 13 ]]
then
echo "中午時(shí)間,吃點(diǎn)午餐,休息一下吧!"
elif [[ $hour -ge 13 && $hour -lt 20 ]]
then
echo "下午時(shí)間,好好工作,專注一下吧!"
else
echo "夜晚時(shí)間,快快,休息一下吧!"
fi
[root@shell-test ~]# chmod +x time_Warn.sh
[root@shell-test ~]# ./time_Warn.sh
##判斷系統(tǒng)時(shí)間##
15:58:12是您當(dāng)前時(shí)間...
下午時(shí)間,好好工作,專注一下吧!
[root@shell-test ~]# ./time_Warn.sh
##判斷系統(tǒng)時(shí)間##
15:58:16是您當(dāng)前時(shí)間...
下午時(shí)間,好好工作,專注一下吧!
[root@shell-test ~]# date
Sat Mar 28 03:58:25 PM CST 2026
2.4 嵌套結(jié)構(gòu)
語(yǔ)法
嵌套結(jié)構(gòu) if 條件測(cè)試1 ;then 命令序列 if 條件測(cè)試1 ;then 命令序列 else 命令序列 fi else 命令序列 fi
示例
[root@shell-test ~]# vim user_add_delete.sh
#!/bin/bash
echo "##### User_Add_Delete #####"
read -p "請(qǐng)輸入新建用戶名稱:" name
id $name &> /dev/null
if [ $? -eq 0 ]
then
read -p "$name已存在,請(qǐng)問(wèn)是否需要?jiǎng)h除(yes/no)?" select
if [ "$select" = "yes" ]
then
userdel -r $name
id $name
echo "$name已經(jīng)被刪除。如果有需要新建用戶,請(qǐng)重新執(zhí)行此程序。"
else
echo "好的,我們不會(huì)刪除$name,再見(jiàn)。"
fi
else
useradd $name
id $name
echo
echo "$name已創(chuàng)建。"
read -p "請(qǐng)輸入密碼(大于等于7位),謝謝。" pass
if [ ${#pass} -ge 7 ]
then
echo $pass | passwd --stdin $name
echo "$name的密碼是$pass,應(yīng)及時(shí)保存。"
else
read -p "你的密碼不滿足長(zhǎng)度要求,請(qǐng)重新輸入:" pass
if [ ${#pass} -ge 7 ]
then
echo $pass | passwd --stdin $name
echo "$name的密碼是$pass,應(yīng)及時(shí)保存。"
else
echo "你已觸發(fā)保護(hù)原則,已退出此程序。"
fi
fi
fi
[root@shell-test ~]# chmod +x user_add_delete.sh [root@shell-test ~]# ./user_add_delete.sh ##### User_Add_Delete ##### 請(qǐng)輸入新建用戶名稱:qwe qwe已存在,請(qǐng)問(wèn)是否需要?jiǎng)h除(yes/no)?yes id: ‘qwe': no such user qwe已經(jīng)被刪除。如果有需要新建用戶,請(qǐng)重新執(zhí)行此程序。 [root@shell-test ~]# ./user_add_delete.sh ##### User_Add_Delete ##### 請(qǐng)輸入新建用戶名稱:qwe uid=1009(qwe) gid=1009(qwe) groups=1009(qwe) qwe已創(chuàng)建。 請(qǐng)輸入密碼(大于等于7位),謝謝。qwe 你的密碼不滿足長(zhǎng)度要求,請(qǐng)重新輸入:qwe 你已觸發(fā)保護(hù)原則,已退出此程序。 [root@shell-test ~]# ./user_add_delete.sh ##### User_Add_Delete ##### 請(qǐng)輸入新建用戶名稱:qwe qwe已存在,請(qǐng)問(wèn)是否需要?jiǎng)h除(yes/no)?no 好的,我們不會(huì)刪除qwe,再見(jiàn)。 [root@shell-test ~]# ./user_add_delete.sh ##### User_Add_Delete ##### 請(qǐng)輸入新建用戶名稱:asd uid=1010(asd) gid=1010(asd) groups=1010(asd) asd已創(chuàng)建。 請(qǐng)輸入密碼(大于等于7位),謝謝。111111 你的密碼不滿足長(zhǎng)度要求,請(qǐng)重新輸入:1111111 Changing password for user asd. passwd: all authentication tokens updated successfully. asd的密碼是1111111,應(yīng)及時(shí)保存。 [root@shell-test ~]# ./user_add_delete.sh ##### User_Add_Delete ##### 請(qǐng)輸入新建用戶名稱:qqq uid=1011(qqq) gid=1011(qqq) groups=1011(qqq) qqq已創(chuàng)建。 請(qǐng)輸入密碼(大于等于7位),謝謝。123123123123 Changing password for user qqq. passwd: all authentication tokens updated successfully. qqq的密碼是123123123123,應(yīng)及時(shí)保存。
2.5 調(diào)試腳本
語(yǔ)法
sh -n xxx.sh # 只檢測(cè)是否有語(yǔ)法錯(cuò)誤 sh -vx xxx.sh # 觀看過(guò)程
示例
[root@shell-test ~]# cat test-1.sh
#!/bin/bash
echo "裁員一定要快!有人截屏了!"
read -p "請(qǐng)輸入姓名:" name
read -p "請(qǐng)輸入工號(hào):" number
read -s -p "請(qǐng)輸入密碼:" passwd # -s 靜默輸出,一般用于密碼
echo
echo "$name,你被優(yōu)化了,組織架構(gòu)調(diào)整了,您的工號(hào)$number已經(jīng)被注銷了,您的密碼也被我們剛剛銷毀,無(wú)權(quán)登錄系統(tǒng),感謝您的付出!"
[root@shell-test ~]# sh -n test-1.sh
[root@shell-test ~]# sh -vx test-1.sh
which () { ( alias;
eval ${which_declare} ) | /usr/bin/which --tty-only --read-alias --read-functions --show-tilde --show-dot $@
}
#!/bin/bash
echo "裁員一定要快!有人截屏了!"
+ echo 裁員一定要快!有人截屏了!
裁員一定要快!有人截屏了!
read -p "請(qǐng)輸入姓名:" name
+ read -p 請(qǐng)輸入姓名: name
請(qǐng)輸入姓名:dhj
read -p "請(qǐng)輸入工號(hào):" number
+ read -p 請(qǐng)輸入工號(hào): number
請(qǐng)輸入工號(hào):001
read -s -p "請(qǐng)輸入密碼:" passwd # -s 靜默輸出,一般用于密碼
+ read -s -p 請(qǐng)輸入密碼: passwd
請(qǐng)輸入密碼:echo
+ echo
echo "$name,你被優(yōu)化了,組織架構(gòu)調(diào)整了,您的工號(hào)$number已經(jīng)被注銷了,您的密碼也被我們剛剛銷毀,無(wú)權(quán)登錄系統(tǒng),感謝您的付出!"
+ echo dhj,你被優(yōu)化了,組織架構(gòu)調(diào)整了,您的工號(hào)001已經(jīng)被注銷了,您的密碼也被我們剛剛銷毀,無(wú)權(quán)登錄系統(tǒng),感謝您的付出!
dhj,你被優(yōu)化了,組織架構(gòu)調(diào)整了,您的工號(hào)001已經(jīng)被注銷了,您的密碼也被我們剛剛銷毀,無(wú)權(quán)登錄系統(tǒng),感謝您的付出!
2.6 注意
[ ]表示條件測(cè)試。注意這里的空格很重要。要注意在[ x ]前面都必須要有空格- 在
shell中,then和fi是分開(kāi)的語(yǔ)句。如果要在同一行里面輸入,則需要用分號(hào)將他們隔開(kāi)。 - 注意
if判斷中對(duì)于變量的處理,需要加引號(hào),以免一些不必要的錯(cuò)誤。沒(méi)有加雙引號(hào)會(huì)在一些含空格等的字符串變量判斷的時(shí)候產(chǎn)生錯(cuò)誤。比如[ -n "$var" ]如果var為空會(huì)出錯(cuò)。 - 判斷是不支持浮點(diǎn)值的。
- 如果只單獨(dú)使用
>或者<號(hào),系統(tǒng)會(huì)認(rèn)為是輸出或者輸入重定向,雖然結(jié)果顯示正確,但是其實(shí)是錯(cuò)誤的,因此要對(duì)這些符號(hào)進(jìn)行轉(zhuǎn)意。 - 默認(rèn),運(yùn)行
if語(yǔ)句中的命令,所產(chǎn)生的錯(cuò)誤信息。仍然出現(xiàn)在腳本的輸出結(jié)果中。 - 使用
-z或者-n來(lái)檢查長(zhǎng)度的時(shí)候,沒(méi)有定義的變量也為0 - 空變量和沒(méi)有初始化的變量可能會(huì)對(duì)
shell腳本測(cè)試產(chǎn)生災(zāi)難性的影響,因此在不確定變量的內(nèi)容的時(shí)候,在測(cè)試號(hào)前使用-n或者-z測(cè)試一下 $?變量包含了之前執(zhí)行命令的退出狀態(tài)(最近完成的前臺(tái)進(jìn)程)(可以用于檢測(cè)退出狀態(tài))
3.模式匹配case
3.1case語(yǔ)法
case 變量 in 模式1) 命令序列1 ;; 模式2) 命令序列2 ;; 模式3) 命令序列3 ;; *) 無(wú)匹配后命令序列 ;; esac
3.2 示例-簡(jiǎn)單的模式匹配
[root@shell-test ~]# vim del_user.sh
#!/bin/bash
echo "### 刪除用戶的程序 ###"
read -p "請(qǐng)輸入要?jiǎng)h除的用戶名:" name
id $name &> /dev/null
if [ $? -eq 0 ]
then
read -p "確認(rèn)刪除么(yes/no)?" action
case $action in
yes|y|Y|Ye|Yes|YE|YEs|YES|yeS|yES)
userdel -r $name
echo "$name已經(jīng)被刪除!"
;;
*)
echo "好的,我們未進(jìn)行任何的改動(dòng),請(qǐng)放心!"
;;
esac
else
echo "$name不存在,不需要?jiǎng)h除,再見(jiàn)。"
fi
[root@shell-test ~]# chmod +x del_user.sh
[root@shell-test ~]# ./del_user.sh
### 刪除用戶的程序 ###
請(qǐng)輸入要?jiǎng)h除的用戶名:op
./del_user.sh: line 19: syntax error: unexpected end of file
[root@shell-test ~]# ./del_user.sh
### 刪除用戶的程序 ###
請(qǐng)輸入要?jiǎng)h除的用戶名:op
op不存在,不需要?jiǎng)h除,再見(jiàn)。
[root@shell-test ~]# useradd op
[root@shell-test ~]# ./del_user.sh
### 刪除用戶的程序 ###
請(qǐng)輸入要?jiǎng)h除的用戶名:op
確認(rèn)刪除么(yes/no)?no
好的,我們未進(jìn)行任何的改動(dòng),請(qǐng)放心!
[root@shell-test ~]# ./del_user.sh
### 刪除用戶的程序 ###
請(qǐng)輸入要?jiǎng)h除的用戶名:op
確認(rèn)刪除么(yes/no)?yes
op已經(jīng)被刪除!
3.3 示例-簡(jiǎn)單的JumpServer
由于工作中,我們需要管理N多臺(tái)服務(wù)器。那么訪問(wèn)服務(wù)器就是一件繁瑣的事情。通過(guò)shell編程,編寫(xiě)跳板程序。當(dāng)我們需要訪問(wèn)服務(wù)器時(shí),看一眼服務(wù)器列表名,按一下數(shù)字,就登錄成功了。豈不美哉。
[root@shell-test ~]# vim jump_server.sh
#!/bin/bash
echo "### 跳板主機(jī) ###"
web1=172.25.254.61
web2=172.25.254.62
mysql1=172.25.254.63
cat <<EOF
1.web1
2.web2
3.mysql1
...
EOF
read -p "請(qǐng)輸入跳轉(zhuǎn)的主機(jī)數(shù)字(1,2,3):" num
case $num in
1)
ssh root@$web1
;;
2)
ssh root@$web2
;;
3)
ssh root@$mysql1
;;
*)
echo "沒(méi)有此選項(xiàng)-已退出..."
esac
[root@shell-test ~]# chmod +x jump_server.sh [root@shell-test ~]# ./jump_server.sh ### 跳板主機(jī) ### 1.web1 2.web2 3.mysql1 ... 請(qǐng)輸入跳轉(zhuǎn)的主機(jī)數(shù)字(1,2,3):
3.4 示例-系統(tǒng)管理工具箱
提供的豐富的管理命令,用戶管理,內(nèi)存管理,磁盤(pán)管理,進(jìn)程管理,日志管理,文件管理,軟件管理,網(wǎng)絡(luò)管理等等數(shù)十個(gè)工具包。
如果你能通過(guò)shell編程,把他們編寫(xiě)到一個(gè)程序里。想用某些功能,只需要按回車(chē),就能完成。豈不美哉。
[root@shell-test ~]# vim help_command.sh
#!/bin/bash
cat <<EOF
1. 磁盤(pán)工具
2. 掛載工具
3. 內(nèi)存工具
q. 退出
此工具箱還在擴(kuò)充功能...
EOF
read -p "請(qǐng)輸入你需要使用的選項(xiàng):" select
case $select in
1)
fdisk -l
echo "已查詢..."
;;
2)
df -hT
echo "已查詢..."
;;
3)
free -m
echo "已查詢"
;;
q)
exit
;;
*)
echo "error......"
esac
以上就是Shell腳本中條件判斷和流程控制語(yǔ)句的使用教學(xué)的詳細(xì)內(nèi)容,更多關(guān)于Shell腳本判斷使用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Shell 實(shí)現(xiàn)多任務(wù)并發(fā)的示例代碼
本文主要介紹了Shell 實(shí)現(xiàn)多任務(wù)并發(fā)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
Linux SHELL if命令參數(shù)說(shuō)明
SHELL if命令參數(shù)介紹,方便學(xué)習(xí)shell命令的朋友,需要的朋友可以參考下2013-01-01
shell腳本批量執(zhí)行指定路徑下sql腳本的實(shí)現(xiàn)
本文主要介紹了shell腳本批量執(zhí)行指定路徑下sql腳本的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
Linux下shell通用腳本啟動(dòng)jar(微服務(wù))
這篇文章主要介紹了Linux下shell通用腳本啟動(dòng)jar(微服務(wù))的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10
shell 腳本自動(dòng)搭建nfs服務(wù)的方法示例
這篇文章主要介紹了shell 腳本自動(dòng)搭建nfs服務(wù)的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05

