基本操作:Shell程式設計之條件語句(檔案測試,整數測試,字串比較+if語句詳+case語句詳解)-----------------我又來了。。。

2020-08-11 19:15:25

前言

在shell指令碼中的各種條件結構和流程控制都要進行各種的測試,然後根據測試的結果執行不同的操作,有時也會和if語句結合,來完成測試判斷,以減少程式的執行錯誤。

也就是說,當我們在寫一個指令碼,裏面沒有任何的判斷,就寫了一些很普通的命令,那麼在我們執行指令碼的時候,當遇到了錯誤,也會一直的執行下去,這樣就導致了我們指令碼執行的結果是錯誤的。 這時候我們就會用到我們的條件測試比較。

那麼在執行條件測試中通常會返回 「真」或者「假」就像我們執行一條成功的命令,那麼執行完這條命令 我們echo$? 如果它返回的是0 那麼就是真的返回的狀態是非0那麼就是假的 也就是錯的

在这里插入图片描述
我又來了

一:條件測試

1.1:test命令

測試表示式是否成立,若成立返回0,否則返回其他數值

格式1:test  條件表達式
格式2:【條件表達式】             '注意兩端要有空格:
'檔案測試

1.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 716 19:55 abc
-rw-r--r--. 1 root root 366 716 19:22 baksh
-rw-r--r--. 1 root root  45 715 14:46 first.sh
-rw-r--r--. 1 root root  41 715 22:07 hu02a.txt
-rw-r--r--. 1 root root  72 715 22:01 hua.txt
drwxr-xr-x. 2 root root   6 1031 2018 rh
-rw-r--r--. 1 root root   0 715 21:57 shuai02.txt
-rw-r--r--. 1 root root 210 716 09:57 shuai.sh
-rw-r--r--. 1 root root 102 716 09:10 shuai.txt
-rwxr-xr-x. 1 root root 110 715 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.3:整數值比較

整數值比較

命令基本格式
[ 整數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.4:字串比較

1.41:字串比較

常用的格式
格式一:[ 字串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.5:邏輯測試

基本格式
格式一: [ 表達式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語句的結構

2.1:單分支結構

單分支結構(基本格式)
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

2.2:雙分支結構

雙分支結構(基本格式)
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

2.3:多分支結構

多分支結構(基本格式)
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語句

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
你沒有進入男子組

寫得稀碎 湊乎瞅
在这里插入图片描述