天天看點

shell腳本--shell程式設計之條件語句(if、case語句)一、條件測試二、if 語句三、case分支語句

文章目錄

  • 一、條件測試
    • 1.1 檔案測試與整數測試
      • 1.1.1 條件測試操作
    • 1.2 一進制運算符,二進制運算符和三元運算符
  • 二、if 語句
    • 2.1 if 單分支語句
    • 2.2 if 雙分支語句
    • 2.3 if 多分支語句
  • 三、case分支語句
    • 1.1 case語句的結構
    • 1.2 case語句的執行個體
      • 1.2.1 建立一個判斷輸入類型的腳本

一、條件測試

1.1 檔案測試與整數測試

1.1.1 條件測試操作

test指令

  • 測試特定的表達式是否成立,當條件成立時,測試語句的傳回值為0,否則為其他數值

    格式一:test 條件表達式

    格式二:[ 條件表達式 ] (兩端要有空格,此法更為常用)

檔案測試

[ 操作符 檔案或目錄 ] ‘注意兩端空格’

常見的測試操作符

  • -d 測試是否為目錄(directory)
  • -e 測試目錄或檔案是否存在(Exist)
  • -f 測試是否為檔案(File)
  • -r 測試目前使用者是否有權限讀取(Read)
  • -w 測試目前使用者是否有權限寫入(Write)
  • -x 測試目前使用者是否有權限執行(eXcute)
[[email protected] opt]# cd aaa
[[email protected] aaa]# ls
[[email protected] aaa]# mkdir ccc
[[email protected] aaa]# ls
ccc
[[email protected] aaa]# test -d ccc
[[email protected] aaa]# echo $?  '&?  傳回0表示條件成立,傳回非零值表示條件不成立'
0
[[email protected] aaa]# test -f ccc
[[email protected] aaa]# echo $?
1
[[email protected] aaa]# touch bbb.txt
[[email protected] aaa]# ls
bbb.txt  ccc
[[email protected] aaa]# test -f bbb.txt 
[[email protected] aaa]# echo $?
0
[[email protected] aaa]# [ -d ccc ]
[[email protected] aaa]# echo $?
0
[[email protected] aaa]# [ -x ccc ]
[[email protected] aaa]# echo $?
0
           
[[email protected] aaa]# ls -l
total 0
-rw-r--r--. 1 root root 0 Nov 26 15:18 bbb.txt
drwxr-xr-x. 2 root root 6 Nov 26 15:17 ccc
[[email protected] aaa]# useradd lisi
[[email protected] ~]# echo "123123" | passwd --stdin lisi
更改使用者 lisi 的密碼 。
passwd:所有的身份驗證令牌已經成功更新。
[[email protected] ~]# su - lisi
最後一次失敗的登入:二 11月 26 15:28:39 CST 2019pts/0 上
最有一次成功登入後有 1 次失敗的登入嘗試。
[[email protected] aaa]$ [ -w ccc ]
[[email protected] aaa]$ echo $?
1
[[email protected] aaa]$ [ -r ccc ]
[[email protected] aaa]$ echo $?
0
           
[[email protected] aaa]$ [ -r ccc ] && echo "yes"    '&&  邏輯與,"而且"的意思'
yes
[[email protected] aaa]$ [ -w ccc ] && echo "yes"
[[email protected] aaa]$ 
[[email protected] aaa]$ [ -w ccc ] || echo "yes"   '||  邏輯或,"或者"的意思'
yes
           
[[email protected] opt]# [ -e /dev/cdrom ] && echo "yes"

yes
[[email protected] 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)

數值比較就用-eq

字元串比較用==

[[email protected] aaa]$ [ 5 -gt 3 ] && echo "yes"
yes
[[email protected] aaa]$ [ 5 -gt 6 ] && echo "yes"
[[email protected] aaa]$ [ 5 -le 6 ] && echo "yes"
yes
[[email protected] aaa]$ [ 5 -le 3 ] && echo "yes"

[[email protected] opt]# who | wc -l
2
[[email protected] opt]# [ $(who|wc -l) -lt 5 ]&& echo "yes"  '測試使用者數是否大于5'
yes
           
[[email protected] opt]# free -m  '看記憶體參數  free -m'
              total        used        free      shared  buff/cache   available
Mem:           3771         719        2396          17         655        2725
Swap:          2047           0        2047

[root@localhost opt]# FreeCC=$(free -m | grep "Mem:" | awk '{print $4}')
[[email protected] opt]# [ $FreeCC -gt 1000 ]&& echo "$FreeCC"MB   '空閑記憶體是否大于1000MB'
2396MB
[[email protected] opt]# [ $FreeCC -gt 1000 ]&& echo "$FreeCC MB"    '另一種表示'
2396 MB
[root@localhost opt]# [ $FreeCC -gt 1000 ]&& echo ${FreeCC}MB            '{}裡面是變量'
2396MB
           

字元串比較

  • 格式一:

    [ 字元串1 = 字元串2 ]

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

  • 格式二:

    [ -z 字元串 ]

常用的測試操作符

  • = 第一個字元串與第二個字元串内容相同
  • != 第一個字元串與第二個字元串内容不同,!号表示相反的意思
  • -z 檢查字元串内容是否為空,對于未定義或賦予空值的變量将視為空串
[[email protected] opt]# [ $LANG != "en_US" ] && echo "yes"
yes
[[email protected] opt]# [ $LANG = "en_US" ] && echo "yes"
[[email protected] opt]# [ "男" = "男" ] && echo "yes"
yes
[[email protected] opt]# [ "男" != "男" ] && echo "yes"
[[email protected] opt]# [ "男" != "女" ] && echo "yes"
yes
[[email protected] opt]# [ "男" = "女" ] && echo "yes"
           
[[email protected] opt]# vim 33.sh
#!/bin/bash
read -p "是否建立/opt/share目錄:(yes/no)" ack
[ $ack = yes ] && mkdir /opt/share
echo "建立成功"
[[email protected] opt]# ./33.sh 
是否建立/opt/share目錄:(yes/no)yes
建立成功
[[email protected] opt]# ls
33.sh    rh  share  
[[email protected] opt]# vim 44.sh
#!/bin/bash
[ -d /opt/demo ] && echo "已經存在" || mkdir /opt/demo && echo "建立成功"
[[email protected] opt]# ./44.sh 
建立成功
[[email protected] opt]# ls
33.sh    rh  share  44.sh demo
           
[[email protected] opt]# echo $LANG
zh_CN.UTF-8
[[email protected] opt]# [ $LANG != "EN" ]&&echo "no"   '兩個字元串不相等'
no
[[email protected] opt]# [ -z '' ]&&echo "no"   '判斷是否為空'
no
           
[[email protected] opt]# vim 33.sh
#!/bin/bash
read -p "是否建立/opt/share目錄:(yes/no)" ack
[ $ack = yes ] && mkdir /opt/share
echo "建立成功"
[[email protected] opt]# ./33.sh 
是否建立/opt/share目錄:(yes/no)yes
建立成功
[[email protected] opt]# ls
33.sh    rh  share  
[[email protected] opt]# vim 44.sh
#!/bin/bash
[ -d /opt/demo ] && echo "已經存在" || mkdir /opt/demo && echo "建立成功"
[[email protected] opt]# ./44.sh 
建立成功
[[email protected] opt]# ls
33.sh    rh  share  44.sh demo
           

邏輯測試

基本格式

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

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

常用的測試操作符

  • -a或&& 邏輯與,“而且”的意思,使用test指令測試時,可将“&&”改為“-a”
  • -o或|| 邏輯或,“或者”的意思,使用test指令測試時,可将“||”改為“-o”
  • ! 邏輯否
[[email protected] opt]# [ -d /opt/demo ] && echo "yes"
yes
[[email protected] opt]# [ ! -d /opt/demo ] && echo "yes"
[[email protected] opt]# [ 1 -eq 1 ] && [ 2 -eq 2 ] && echo "yes"
yes
[[email protected] opt]# [ 1 -eq 1 -a 2 -eq 2 ] && echo "yes"		'-a和-o也可使用在[]中,更加友善'
yes
           

1.2 一進制運算符,二進制運算符和三元運算符

一進制運算符

  • 帶一進制運算符的表達式遵循從右到左的結合性,常見的一進制表達式:++一進制表達式,–一進制表達式
  • 字首自增運算符與字首自減運算符
  • 在一進制表達式的前面添加運算符++或–後得到的表達式是一個一進制表達式。操作數将被加1(++)或減1(–),表達式的值是經過加1、減1 以後的值。操作數必須是一個左值。
  • i=1;

    i++: i=$i+1

    i=i++:先指派在運算

    i=++i:先自加在指派

    i=–i:先自減在指派

[[email protected] opt]# i=1
[[email protected] opt]# echo $i
1
[[email protected] opt]# let i=++i
[[email protected] opt]# echo $i
2
[[email protected] opt]# let i+=2 	'相當于i=i+2'
[[email protected] opt]# echo $i
4
           

二進制運算符

  • a + b = c

三元運算符

  • 條件&&結果1 || 結果2

二、if 語句

2.1 if 單分支語句

單分支結構

單分支結構(基本格式)
if 條件測試操作
	then  指令序列
fi
           
單分支結構(舉例)
if 磁盤已用空間>80%
	then  報警
fi
           
shell腳本--shell程式設計之條件語句(if、case語句)一、條件測試二、if 語句三、case分支語句
  • exit 1 異常退出
  • exit 0 正常退出
[[email protected] opt]# vim eee.sh

#!/bin/bash
dir "/opt/demo02"
if [ ! -d $dir ]	'若不存在/opt/demo2,則執行下述指令'
 then
        mkdir -p $dir
        echo "$dir建立成功"
fi
[[email protected] opt]# chmod +x eee.sh 
[[email protected] opt]# ./eee.sh 
/opt/demo02建立成功
           

2.2 if 雙分支語句

雙分支結構(基本格式)
if 條件測試操作
	then  指令序列1
	else  指令序列2
fi
           
雙分支結構(舉例)
if 80端口是否在監聽
	then  網站服務已在運作
	else  啟動httpd服務
fi
           
shell腳本--shell程式設計之條件語句(if、case語句)一、條件測試二、if 語句三、case分支語句

例一:

[[email protected] opt]# vim eee.sh
#!/bin/bash
dir="/opt/demo02"
if [ ! -d $dir ]
 then
        mkdir -p $dir
        echo "$dir建立成功"
  else
        echo "$dir已存在"
fi
[[email protected] opt]# ./eee.sh 
/opt/demo02已存在
           

例2:檢視目标主機是否存活,顯示檢測結果

[[email protected] opt]# vim fff.sh
#!/bin/bash
read -p "請輸入IP位址:" addr
ping -c 3 -i 0.2 -W 3 $addr &> /dev/null
if [ $? -eq 0 ]
        then
                echo "$addr is up"
        else
                echo "$addr is down"
fi
[[email protected] opt]# chmod +x fff.sh 
[[email protected] opt]# ./fff.sh 
請輸入IP位址:192.168.100.1      
192.168.100.1 is down
[[email protected] opt]# ./fff.sh 
請輸入IP位址:192.168.197.1
192.168.197.1 is up
其中:
-c:發送三個包
-i: 發包廂隔0.2秒
-W:等待時間3秒
           

2.3 if 多分支語句

多分支結構(基本格式)
if 條件測試操作1
	then  指令序列1
elif  條件測試操作2
	then  指令序列2
else
	指令序列3
fi
           
多分支結構(舉例)
if 分數為85~100之間
	then  判為優秀
elif  分數為70~84之間
	then  判為合格
else
	判為不合格
fi
           
shell腳本--shell程式設計之條件語句(if、case語句)一、條件測試二、if 語句三、case分支語句

舉例:判斷分數範圍,分數優秀,合格,不合格三擋

[[email protected] opt]# vim ggg.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

[[email protected] opt]# ./ggg.sh 
請輸入成績:100
成績優秀
[[email protected] opt]# ./ggg.sh 
請輸入成績:82
成績合格
[[email protected] opt]# ./ggg.sh 
請輸入成績:53  
成績不合格
[[email protected] opt]# ./ggg.sh 
請輸入成績:111
輸入有誤
[[email protected] opt]# ./ggg.sh 
請輸入成績:-23
輸入有誤
           

三、case分支語句

1.1 case語句的結構

  • 針對變量的不同取值,分别執行不同的指令序列
  • 這種情況與多分支的if語句非常相似,隻不過if語句需要判斷多個不同的條件,而case語句訓示判斷一個變量的不同取值
格式:
case 變量值 in
模式1)
	指令序列1
	;;
模式2)
	指令序列2
	;;
	....
*)
	預設指令序列
esac
           
執行個體:
case 控制指令 in
start)
	啟動XX服務
	;;
stop)
	停止XX服務
	;;
	....
*)
	顯示服務腳本的用法
esac
           
shell腳本--shell程式設計之條件語句(if、case語句)一、條件測試二、if 語句三、case分支語句

case比對一個區間範圍

往往用于列出菜單

1:

2:

3:

會用于寫服務啟動腳本

/etc/init.d/network

1.2 case語句的執行個體

1.2.1 建立一個判斷輸入類型的腳本

  • 提示使用者輸入一個字元
  • 判斷出該字元是字母,數字或者其他字元
  • case 後面的雙引号可以去掉
  • $後面 加個大括号,友善閱讀。
[[email protected] opt]# vim panduan.sh
#!/bin/bash
read -p "請輸入一個字元:" aa
case "$aa" in
[0-9])
        echo "你輸入的是數字"
        ;;
[a-z]|[A-Z])
        echo "你輸入的是字母"
        ;;
*)
        echo "你輸入的是符号"
esac
~  
[[email protected] opt]# chmod +x panduan.sh 
[[email protected] opt]# ./panduan.sh 
請輸入一個字元:3
你輸入的是數字
[[email protected] opt]# ./panduan.sh 
請輸入一個字元:e
你輸入的是字母
[[email protected] opt]# ./panduan.sh 
請輸入一個字元:#
你輸入的是符号
           
'男女組賽跑,10秒進決賽判斷'
[[email protected] opt]# vim bak.sh
[[email protected] opt]# vim saipao.sh
#!/bin/bash
read -p "請輸入性别:" sex
read -p "請輸入成績:" score
case $score in
  [0-9]|10)
    echo "進入決賽,是$sex組"
    ;;
  *)
    echo "淘汰"
esac

[[email protected] opt]# chmod +x saipao.sh
[[email protected] opt]# ./saipao.sh
請輸入性别:男
請輸入成績:18
淘汰
[[email protected] opt]# ./saipao.sh
請輸入性别:男
請輸入成績:8
進入決賽,是男組
[[email protected] opt]# ./saipao.sh
請輸入性别:女
請輸入成績:9
進入決賽,是女組
[[email protected] opt]# ./saipao.sh
請輸入性别:12
[[email protected] opt]# ./saipao.sh
請輸入性别:女
請輸入成績:12
淘汰
           

随機值:echo $RANDOM

[[email protected] opt]# echo $RANDOM
27715
[[email protected] opt]# echo $RANDOM
13611
[[email protected] opt]# echo $RANDOM
17975
           

0-10的随機值:

[[email protected] opt]# echo $[$RANDOM%10]
4
[[email protected] opt]# echo $[$RANDOM%10]
1
[[email protected] opt]# echo $[$RANDOM%10]
2
           

繼續閱讀