在shell指令碼中的各種條件結構和流程控制都要進行各種的測試,然後根據測試的結果執行不同的操作,有時也會和if語句結合,來完成測試判斷,以減少程式的執行錯誤。
也就是說,當我們在寫一個指令碼,裏面沒有任何的判斷,就寫了一些很普通的命令,那麼在我們執行指令碼的時候,當遇到了錯誤,也會一直的執行下去,這樣就導致了我們指令碼執行的結果是錯誤的。 這時候我們就會用到我們的條件測試比較。
那麼在執行條件測試中通常會返回 「真」或者「假」就像我們執行一條成功的命令,那麼執行完這條命令 我們echo$? 如果它返回的是0 那麼就是真的返回的狀態是非0那麼就是假的 也就是錯的
我又來了
測試表示式是否成立,若成立返回0,否則返回其他數值
格式1:test 條件表達式
格式2:【條件表達式】 '注意兩端要有空格:
'檔案測試
[操作符 檔案或目錄]
&? 返回0表示條件成立,返回非零值表示條件不成立
&& 邏輯與,"而且"的意思
|| 邏輯或,"或者"的意思
常見的測試操作符 | 解釋 |
---|---|
-d | 測試是否爲目錄(directory) |
-e | 測試目錄或檔案是否存在(Exist) |
-f | 測試是否爲檔案(File) |
-r | 測試當前使用者是否有許可權讀取(Read) |
-w | 測試當前使用者是否有許可權寫入(Write) |
-x | 測試當前使用者是否有許可權執行(eXcute) |
[root@localhost ~]# touch abc.txt
[root@localhost ~]# test -f a
abc.txt anaconda-ks.cfg
[root@localhost ~]# test -f abc.txt
[root@localhost ~]# echo $?
0
[root@localhost ~]# test -d abc.txt
[root@localhost ~]# echo $?
1
[root@shuai opt]# mkdir abc
[root@shuai opt]# ls
abc first.sh hua.txt shuai02.txt shuai.txt
baksh hu02a.txt rh shuai.sh tom.sh
[root@shuai opt]# [ -d /opt/abc ]
[root@shuai opt]# echo $?
0
[root@shuai opt]# [ -x /opt/abc ]
[root@shuai opt]# echo $?
0
[root@shuai opt]# ll
總用量 28
drwxr-xr-x. 2 root root 6 7月 16 19:55 abc
-rw-r--r--. 1 root root 366 7月 16 19:22 baksh
-rw-r--r--. 1 root root 45 7月 15 14:46 first.sh
-rw-r--r--. 1 root root 41 7月 15 22:07 hu02a.txt
-rw-r--r--. 1 root root 72 7月 15 22:01 hua.txt
drwxr-xr-x. 2 root root 6 10月 31 2018 rh
-rw-r--r--. 1 root root 0 7月 15 21:57 shuai02.txt
-rw-r--r--. 1 root root 210 7月 16 09:57 shuai.sh
-rw-r--r--. 1 root root 102 7月 16 09:10 shuai.txt
-rwxr-xr-x. 1 root root 110 7月 15 20:02 tom.sh
echo $? 查詢上個步驟是否成立,成立則爲0,不成立則爲非0值
&& 是而且的含義 表示如果兩邊的條件都成立,纔會正確執行;echo "yes"很明顯是正確的
[root@shuai opt]# [ -e /dev/cdrom ] && echo "yes"
yes
[root@shuai opt]# test -e /dev/cdrom && echo "yes"
yes
整數值比較
命令基本格式
[ 整數1 操作符 整數2 ]
常用的測試操作符
操作符 | 解釋 |
---|---|
-eq | 等於(Equal) |
-ne | 不等於(Not Equal) |
-gt | 大於(Greater Than) |
-lt | 小於(Lesser Than) |
-le | 小於或等於(Lesser or Equal) |
-ge | 大於或等於(Greater or Equal) |
[root@locaswiftlhost ~]# [ 12 -lt 80 ] && echo "yes"
yes
[root@localhost ~]# [ 80 = 80 ] && echo "yes"
yes
[root@localhost ~]# [ 80 == 80 ] && echo "yes"
yes
[root@localhost ~]# [ 80 -eq 80 ] && echo "yes"
yes
數值比較用eq
[root@localhost ~]# [ 'liu' == 'liu' ] && echo "yes"
yes
[root@localhost ~]# [ 'liu'-eq 'liu' ] && echo "yes"
-bash: [: liu-eq: 期待一元表達式
[root@localhost ~]# [ 'zhangsan' == 'zhang' ] && echo "yes"
##這邊是取反成立 本身不成立的可以取反就行
[root@localhost ~]# [ ! 'zhangsan' == 'zhang' ] && echo "yes"
yes
命令前面加括號或者反撇
bash: [3: 未找到命令...
[root@localhost ~]# [ $(who|wc -l) -lt 5 ] && echo "Too many."
Too many.
檢視記憶體資訊
[root@localhost ~]# free -m
total used free shared buff/cache available
Mem: 3771 216 3249 12 305 3271
Swap: 0 0 0
[root@localhost ~]# free -m | grep "Mem:"
Mem: 3771 217 3248 12 305 3270
[root@localhost ~]# free -m | grep "Mem:" | awk '{print $4}'
3161
[root@localhost ~]# shuai=$(free -m | grep "Mem:" | awk '{print $4}')
[root@localhost ~]# [ $shuai -gt 1000 ]&& echo "$shuai MB"
3160 MB
[root@localhost ~]# [ $shuai -gt 1000 ]&& echo "$shuai"MB
3160MB
[root@localhost ~]# [ $shuai -gt 1000 ]&& echo ${shuai}MB
3160MB '$跟大括號表示一個變數'
常用的格式
格式一:[ 字串1 = 字串2 ]
[ 字串1 != 字串2 ]
格式二:[ -z 字串 ]
常用的測試操作符 | 解釋 |
---|---|
= | 第一個字串與第二個字串內容相同 |
!= | 第一個字串與第二個字串內容不同,!號表示相反的意思 |
-z | 檢查字串內容是否爲空,對於未定義或賦予空值的變數將視爲空串 |
'兩個字串不相等'
[root@localhost ~]# [ $LANG != "EN" ]&&echo "no"
no
[root@localhost ~]# [ -z '' ]&&echo "yes"
yes
[root@localhost ~]# [ -z ' ' ]&&echo "yes"
[root@localhost ~]# [ -z "" ]&&echo "yes"
yes
[root@shuai opt]# [ "帥哥" = "帥哥" ]&& echo "yes"
yes
[root@shuai opt]# [ "帥哥" = "靚男" ]&& echo "yes"
[root@shuai opt]# [ "帥哥" != "靚男" ]&& echo "yes"
yes
[root@shuai opt]# vim test.sh
#!/bin/bash
read -p "是否覆蓋" xiaokeai
[ $xiaokeai = "yes" ]&&echo "覆蓋"
~
[root@shuai opt]# ./test.sh
是否覆蓋yes
覆蓋
[root@shuai opt]# ./test.sh
是否覆蓋no
#
[root@shuai opt]# vim tom.sh
#!/bin/bash
read -p "是否建立opt/lisi目錄(是/否)" ack
[ $ack = 是 ]&& mkdir /opt/lisi
echo "搞定"
[root@shuai opt]# sh tom.sh
是否建立opt/lisi目錄(是/否)是
搞定
[root@shuai opt]# ls
baksh first.sh hu02a.txt lisi rh test.sh tom.sh
[root@shuai opt]# vim dd.sh
#!/bin/bash
read -p "是否建立opt/mone目錄:(是/否)" shuai
[ -d /opt/mone ]&& echo "/opt/mone" || mkdir /opt/mone && echo "建立完成"
[root@shuai opt]# sh dd.sh
是否建立opt/mone目錄:(是/否)是
/opt/mone
建立完成
基本格式
格式一: [ 表達式1 ] 操作符 [ 表達式2 ] ...
格式二: 命令1 操作符 命令2 ...
常用的測試操作符 | 解釋 |
---|---|
&& | 邏輯與,「而且」的意思,使用test命令測試時,可將「&&」改爲「-a」 |
ll | 邏輯或,「或者」的意思,使用test命令測試時,可將「 |
! | 邏輯否 |
範例:
[root@localhost ~]# [ -d /etc ] && [ -r/etc ] && echo "Yes"
Yes
##兩個有一個成立就行
[root@localhost ~]# [ -d /etc ] || [ -r/etc ] && echo "Yes"
Yes
[root@localhost ~]# [ -f /etc ] || [ -r/etc ] && echo "Yes"
Yes
單分支結構(基本格式)
if 條件測試操作
then 命令序列
fi
單分支結構(舉例)
if 磁碟已用空間>70%
then 報警
fi
單分之針對成立
exit 1異常退出
exit 0正常退出
[root@shuai opt]# vim xx.sh
#!/bin/bash
read -p "請輸入目錄位置:" TT
if [ ! -d $TT ]
then
mkdir -p $TT
echo "$TT建立完成"
fi
請輸入目錄位置:/opt/niu
/opt/niu建立完成
[root@shuai opt]# ls '已經生成niu目錄'
baksh first.sh lisi niu test.sh xx.sh
dd.sh hu02a.txt mone rh tom.sh
雙分支結構(基本格式)
if 條件測試操作
then 命令序列1
else 命令序列2
fi
雙分支結構(舉例)
if 80埠是否在監聽
then 網站服務已在執行
else 啓動httpd服務
fi
範例:
[root@localhost ~]# vim pinghost.sh
#!/bin/bash
read -p "請輸入IP地址:" shuai
ping -c 3 -i 0.2 -W 3 $shuai &>/dev/null
if [ $? -eq 0 ]
then
echo "Host $shuai is up."
else
echo "Host $shuai IS down."
fi
[root@localhost ~]# sh pinghost.sh
請輸入IP地址:8.8.8.8
Host IS down.
#-c:發送包 -i:發送間隔 -W:等待時間
[root@shuai opt]# vim ss.sh
#!bin/bash
read -p "請輸入目錄位置:" TT
if [ -d $TT ]
then
echo "目錄已存在"
else
mkdir -p $TT
fi
[root@shuai opt]# sh ss.sh
請輸入目錄位置:/opt/rid
多分支結構(基本格式)
if 條件測試操作1
then 命令序列1
elif 條件測試操作2
then 命令序列2
else
命令序列3
fi
多分支結構(舉例)
if 分數爲85~100之間
then 判爲優秀
elif 分數爲70~84之間
then 判爲合格
else
判爲不合格
fi
舉例:判斷分數範圍,分數優秀,合格,不合格三擋
[root@localhost opt]# vim gg.sh
#!/bin/bash
read -p "請輸入成績:" score
if [ $score -lt 0 ] || [ $score -gt 100 ]
then
echo "輸入有誤"
exit 1;
elif [ $score -ge 85 ] && [ $score -le 100 ]
then
echo "成績優秀"
elif [ $score -ge 70 ] && [ $score -le 84 ]
then
echo "成績合格"
else
echo "成績不合格"
fi
[root@localhost opt]# ./gg.sh
請輸入成績:95
成績優秀
[root@localhost opt]# ./gg.sh
請輸入成績:83
成績合格
[root@localhost opt]# ./gg.sh
請輸入成績:53
成績不合格
[root@localhost opt]# ./gg.sh
請輸入成績:110
輸入有誤
[root@localhost opt]# ./gg.sh
請輸入成績:-56
輸入有誤
[root@shuai opt]# vim gg
#!/bin/bash
read -p "請問你一天睡了幾小時:" sleep
if [ $sleep -ge 0 ] && [ $sleep -le 24 ]
then
if [ $sleep -ge 6 ] && [ $sleep -le 8 ]
then
echo "睡眠品質很好"
elif [ $sleep -ge 1 ] && [ $sleep -le 5 ]
then
echo "容易得糖尿病、高血壓,要改善睡眠品質"
else
echo "姐們睡太多啦"
fi
else
echo "請輸入(0-24)區間值 "
fi
~
[root@shuai opt]# sh gg
請問你一天睡了幾小時:1
容易得糖尿病、高血壓,要改善睡眠品質
[root@shuai opt]# sh gg
請問你一天睡了幾小時:9
姐們睡太多啦
[root@shuai opt]# sh gg
請問你一天睡了幾小時:8
睡眠品質很好
##這邊娛樂一下 不喜勿噴
case 語句和 if…elif…else 語句一樣都是多分支條件語句,不過和多分支 if 條件語句不同的是,case 語句只能判斷一種條件關係,而 if 語句可以判斷多種條件關係。
case $變數名 in
"值 1")
;;
如果變數的值等於值1,則執行程式1,值
2")
如果變數的值等於值2,則執行程式2
…省略其他分支…
*)
如果變數的值都不是以上的值,則執行此程式
;;
esac
#男子組跟女子組百米跑步10秒以內
[root@shuai opt]# vim baksh
#!/bin/bash
read -p "請輸入性別: " sex
read -p "請輸入成績: " score
case $sex in
男)
case $score in
[1-9]|10)
echo "你進入男子組"
;;
*)
echo "你沒有進入男子組"
esac
;;
女)
case $score in
[1-9]|10)
echo "你進入女子組"
;;
*)
echo "你沒有進入女子組"
esac
;;
*)
echo "你輸入的性別錯誤"
esac
[root@shuai opt]# sh baksh
請輸入性別: 男
請輸入成績: 3
你進入男子組
[root@shuai opt]# sh baksh
請輸入性別: 女
請輸入成績: 10
你進入女子組
[root@shuai opt]# sh baksh
請輸入性別: 男
請輸入成績: 23
你沒有進入男子組
寫得稀碎 湊乎瞅