天天看點

shell程式設計之條件語句條件測試#檔案測試if語句的結構case多分支語句

shell程式設計之條件語句

  • 條件測試
    • test指令
  • #檔案測試
    • 整數值比較
    • 字元串比較
    • 邏輯測試
  • if語句的結構
    • 單分支結構
    • 雙分支結構
    • 多分支結構
  • case多分支語句

條件測試

test指令

測試表達式是否成立,若成立傳回0,否則傳回其他數值令

格式1: test 條件表達式

[[email protected] ~]# touch a
[[email protected] ~]# test -f a
[[email protected] ~]# echo $?
0
[[email protected] ~]#
           

格式2:[條件表達式]

[[email protected] ~]# [ -f a ] 
[[email protected] ~]# echo $?
0
[[email protected] ~]#
           

#檔案測試

[操作符 檔案或目錄】

常用的測試操作符

-d:測試是否為目錄(Directory)

[[email protected] ~]# test -d a
[[email protected] ~]# echo $?
1
[[email protected] ~]#
           

-e:測試目錄或檔案是否存在(Exist)

[[email protected] ~]# test -e a
[[email protected] ~]# echo $?
0
[[email protected] ~]# 
           

-f:測試是否為檔案(File)

[[email protected] ~]# touch a
[[email protected] ~]# test -f a
[[email protected] ~]# echo $?
0
[[email protected] ~]#
           

-r:測試目前使用者是否有權限讀取(Read)

[[email protected] ~]# test -r a
[[email protected] ~]# echo $?
0
[[email protected] ~]# 
           

-w:測試目前使用者是否有權限寫入(Write)

[[email protected] ~]# test -w a
[[email protected] ~]# echo $?
0
[[email protected] ~]# 
           

-x:測試目前使用者是否有權限執行(eXcute)

[[email protected] ~]# test -x a
[[email protected] ~]# echo $?
1
[[email protected] ~]# 
           
[[email protected] ~]# mkdir /media/cdrom
[[email protected] ~]# [ -d /media/cdrom ]
[[email protected] ~]# echo $?
0--------------------------------------------傳回0表示條件成立
[[email protected] ~]# [ -d /media/cdrom/Server ]
[[email protected] ~]# echo $?
1--------------------------------------------傳回1表示條件不成立
[[email protected] ~]# [ -d /media/cdrom ] && echo "YES"
YES-----------------------------------------邏輯與  而且的意思
[[email protected] ~]# 
           

整數值比較

[整數1 操作符 整數2]

[[email protected] ~]# who 
root     :0           2020-11-03 14:08 (:0)
root     pts/0        2020-11-04 18:18 (192.168.188.1)
[[email protected] ~]# who | wc -l
2
[[email protected] ~]# [ $(who | wc -l) -ge 5 ] && echo "too many"
[[email protected] ~]# [ $(who | wc -l) -le 5 ] && echo "too many"
too many
[[email protected] ~]# 
           
[[email protected] ~]# [ $(free -m | grep Mem: | awk '{print $7}') -ge 1024 ] && echo  "記憶體可用空間:$(free -m | grep Mem: | awk '{print $7}')"
記憶體可用空間:2661
[[email protected] ~]# 
           

常用的測試操作符

-eq:等于(Equal)

-ne:不等于(Not Equal)

-gt:大于(Greater Than)

-lt:小于(Lesser Than)

-le:小于或等于(Lesser or Equal)

-ge:大于或等于(Greater or Equal)

需要前面的條件成立 才能輸出

[[email protected] ~]# [ 1 -gt 2 ] && echo "tree"
[[email protected] ~]# [ 1 -lt 2 ] && echo "tree"
tree
[[email protected] ~]# 
           

字元串比較

格式1:

[ 字元串1 = 字元串2 ]

[ 字元串1 != 字元串2 ]

[[email protected] ~]# [ 'a' = 'b' ]
[[email protected] ~]# echo $?
1
[[email protected] ~]# [ 'a' = 'b' ] && echo "a不等于b"
[[email protected] ~]# 

[[email protected] ~]# [ 'a' != 'b' ] && echo "a不等于b"
a不等于b
[[email protected] ~]# 
           

格式2:

[ -z 字元串 ]

[[email protected] ~]# [ -z '' ] && echo "空格"
空格
[[email protected] ~]# 
           

常用的測試操作符

=:字元串内容相同

!=:字元串内容不同,!号表示相反的意思

-z:字元串内容為空

[[email protected] ~]# read -p "是否覆寫現有内容?(yes/no)" ack
是否覆寫現有内容?(yes/no)yes
[[email protected] ~]# [ $ack="yes" ] && echo "覆寫"
覆寫
[[email protected] ~]# 
           

邏輯測試

格式1:[ 表達式1 ] 操作符 [表達式2] …

格式2:指令1 操作符 指令2 …

常用的測試操作符

-a或&&:邏輯與,“而且”的意思

-o或||:邏輯或,“或者”的意思

!:邏輯否

if語句的結構

單分支結構

if 條件測試操作

then 指令序列

fi

shell程式設計之條件語句條件測試#檔案測試if語句的結構case多分支語句
shell程式設計之條件語句條件測試#檔案測試if語句的結構case多分支語句
[[email protected] ~]# vi mkdir.sh
#!/bin/bash
# 建立目錄
dir="/a/b"
if [ ! -d $dir ]
then mkdir -p $dir
fi

[[email protected] ~]# chmod +x mkdir.sh 
[[email protected] ~]# ./mkdir.sh 
           
[[email protected] ~]# su sf
[[email protected] root]$ sudo vi a.sh
#!/bin/bash
# 判斷使用者是否為root
if [ ! '$USER' = 'root' ]]
then echo "目前使用者不是root"
fi

[[email protected] root]$ sudo chmod +x a.sh
[[email protected] root]$ sudo ./a.sh
目前使用者不是root
[[email protected] root]$ 
           

雙分支結構

shell程式設計之條件語句條件測試#檔案測試if語句的結構case多分支語句
shell程式設計之條件語句條件測試#檔案測試if語句的結構case多分支語句

判斷apache是否啟動中

[[email protected] ~]# vi a1.sh

#!/bin/bash
# 判斷apache是否啟動中
netstat -anpt | grep 80
if [ $? = 0 ]
then echo "網站服務啟動中"
else echo "網站服務停止"
fi

[[email protected] ~]# chmod +x a1.sh 
[[email protected] ~]# ./a1.sh 
網站服務停止
           

雙分支if語句隻是在單分支的基礎上針對“條件不成立”的情況執行另一種操作,而不是“坐視不管”地不執行任何操作。

例如,若要編寫一個連通性測試腳本 pinghost.sh,通過位置參數$1提供自标主機位址,然後根據ping檢測結果給出相應的提示,可以參考以下操作過程。

ping

[[email protected] ~]# vi ping.sh 

#!/bin/bash
# 檢視是否能ping通
ping -c 3 $1 &> /dev/null
if [ $? = 0 ]
then echo "ping通了"
else
echo "ping不通"
fi
[[email protected] ~]# chmod +x ping.sh 
[[email protected] ~]# ./ping.sh 192.168.188.60
ping通了
[[email protected] ~]#
           

天氣

[[email protected] ~]# vi tiangi.sh

#!/bin/bash
# 天氣
read -p "天氣" weather
if [ "$weather" = "天晴" ]
then echo "好天氣"
else
echo "今天可能要帶傘"
fi
[[email protected] ~]# chmod +x tiangi.sh 
[[email protected] ~]# ./tiangi.sh 
天氣天晴
好天氣
[[email protected] ~]# 
           

多分支結構

shell程式設計之條件語句條件測試#檔案測試if語句的結構case多分支語句
shell程式設計之條件語句條件測試#檔案測試if語句的結構case多分支語句
shell程式設計之條件語句條件測試#檔案測試if語句的結構case多分支語句
[[email protected] ~]# vi grade.sh
#!/bin/bash
# 成績判斷
read -p "您的成績是:" grade
if [ $grade -gt 100 ] || [ $grade -lt 0 ]
then echo "輸入錯誤,請重新輸入0~100間數值"
elif [ $grade -ge 85 ] && [ $grade -le 100 ]
then echo "優秀!!"
elif [ $grade -ge 70 ] && [ $grade -le 84 ]
then echo "良好!!"
elif [ $grade -ge 60 ] && [ $grade -le 69 ]
then echo "合格!!!"
else echo "不合格!!"
fi
[[email protected] ~]# chmod +x grade.sh 
[[email protected] ~]# ./grade.sh 
您的成績是:95
優秀!!
[[email protected] ~]# ./grade.sh 
您的成績是:101
輸入錯誤,請重新輸入0~100間數值
[[email protected] ~]# ./grade.sh 
您的成績是:88
優秀!!
[[email protected] ~]# ./grade.sh 
您的成績是:77
良好!!
[[email protected] ~]# ./grade.sh 
您的成績是:59
不合格!!
[[email protected] ~]# 
           

case多分支語句

shell程式設計之條件語句條件測試#檔案測試if語句的結構case多分支語句
shell程式設計之條件語句條件測試#檔案測試if語句的結構case多分支語句
shell程式設計之條件語句條件測試#檔案測試if語句的結構case多分支語句
shell程式設計之條件語句條件測試#檔案測試if語句的結構case多分支語句
shell程式設計之條件語句條件測試#檔案測試if語句的結構case多分支語句