溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

理論 : shell編程之條件語句————理論講解

發(fā)布時(shí)間:2020-06-28 02:27:49 來源:網(wǎng)絡(luò) 閱讀:484 作者:wx5d8b05ec4cbc3 欄目:系統(tǒng)運(yùn)維

前言:
條件語句也是流程控制語句,日常生活邏輯

條件測試

  • 文件測試
  • 整數(shù)測試
  • 字符串與邏輯測試

if語句

  • if單分支語句
  • if雙分支語句
  • if多分支語句

一 :條件測試操作

1.1.1 test命令

  • 測試特定的表達(dá)式是否成立,當(dāng)條件成立時(shí),測試語句的返回值為0,否則為其他數(shù)值
'格式1:test 條件表達(dá)式
'格式2:[ 條件表達(dá)式 ]

在格式2中,前后至少有一個(gè)空格

1.1.2 文件測試 文件類型和權(quán)限測試

  • [ 操作符 文件或目錄 ]

1.1.3 常用的測試操作符

  • -e :測試目錄或文件是否存在(Exist)
  • -d :測試是否為目錄(Directory)
  • -f :測試是否為文件(File)
  • -r :測試當(dāng)前用戶是否有權(quán)限讀?。≧ead)
  • -w :測試當(dāng)前用戶是否有權(quán)限寫入(Write)
  • -x :測試當(dāng)前用戶是否有權(quán)限執(zhí)行(eXcute)
[root@localhost opt]# touch test.txt
[root@localhost opt]# mkdir abc
[root@localhost opt]# ls
abc  rh  test.txt  wwwroot
[root@localhost opt]# test -d /opt/abc/
[root@localhost opt]# echo $?
0
[root@localhost opt]# [ -d /opt/abc ]
[root@localhost opt]# echo $?
0
[root@localhost opt]# test -f /opt/abc
[root@localhost opt]# echo $?
1
[root@localhost opt]# test -f /opt/test.txt 
[root@localhost opt]# echo $?
0
[root@localhost opt]# test -f /opt/te.txt
[root@localhost opt]# echo $?
1
[root@localhost opt]# [ -x /opt/abc]
bash: [: 缺少 `]'
[root@localhost opt]# [ -x /opt/abc ]
[root@localhost opt]# ls -al
總用量 16
drwxr-xr-x.  5 root root 156 11月 26 13:51 .
dr-xr-xr-x. 17 root root 224 10月 23 13:41 ..
'drwxr-xr-x.  2 root root   6 11月 26 13:51 abc
drwxr-xr-x.  2 root root   6 3月  26 2015 rh
-rw-r--r--.  1 root root   0 11月 26 13:51 test.txt
[gsy@localhost opt]$ [ -w /opt/abc ]
[gsy@localhost opt]$ echo $?
1
[gsy@localhost opt]$ [ -w /opt/abc ]&&echo "yes"
[gsy@localhost opt]$ echo $?
1
[gsy@localhost opt]$ [ -r /opt/abc ]&&echo "yes"
yes
[gsy@localhost opt]$ echo $?
0
[gsy@localhost opt]$ 

echo $? 查詢上個(gè)步驟是否成立,成立則為0,不成立則為非0值

[gsy@localhost opt]$ [ -w /opt/abc ]&&echo "yes"

&& 是而且的含義 表示如果兩邊的條件都成立,才會(huì)正確執(zhí)行;echo "yes"很明顯是正確的,即若是[ -w /opt/abc ]成立,則會(huì)輸出yes,若是不成立,則不會(huì)輸出yes,這種操作可以變相地來驗(yàn)證操作是否成立

|| 或的含義,只要有一個(gè)成立,整體就算對(duì);第一個(gè)對(duì)的話,就不會(huì)在去查看下面操作

[root@localhost opt]# [ -d /opt/abc ]|| echo "year"
[root@localhost opt]# echo $?
0
[root@localhost opt]# [ -d /opt/ab ]|| echo "year"
year
[root@localhost opt]# echo $?
0
[root@localhost opt]# [ -d /opt/abc ]|| echo "year"
[root@localhost opt]# echo $?
0

1.2.1 整數(shù)值比較

[ 整數(shù)1 操作符 整數(shù)2 ]

1.2.2 常用的測試操作符

  • -eq :等于(Equal)
  • -ne :不等于(Not Equal)
  • -gt :大于(Greater Than)
  • -lt :小于(Lesser Than)
  • -le :小于或等于(Lesser or Equal)
  • -ge :大于或等于(Greater or Equal)
[root@localhost opt]# [ 5 -gt 3 ]&& echo "yes"
yes
[root@localhost opt]# [ 5 >  3 ]&& echo "yes"
yes
[root@localhost opt]# [ 5 <  3 ]&& echo "yes"
yes
[root@localhost opt]# [ 5 \<  3 ]&& echo "yes"
[root@localhost opt]# echo $?
1
[root@localhost opt]# [ 5 \=  3 ]&& echo "yes"
[root@localhost opt]# [ 5 \>  3 ]&& echo "yes"
yes
[root@localhost opt]# [ 3 \=  3 ]&& echo "yes"
yes
[root@localhost opt]# [ 3 ==  3 ]&& echo "yes"
yes
[root@localhost opt]# [ 3 !=  3 ]&& echo "yes"
[root@localhost opt]# echo $?
1
[root@localhost opt]# [ 3 !=  4 ]&& echo "yes"
yes
[root@localhost opt]# [ 3 >=  3 ]&& echo "yes"
bash: [: 3: 期待一元表達(dá)式
[root@localhost opt]# [ 3 =>  3 ]&& echo "yes"
bash: [: 3: 期待一元表達(dá)式
[root@localhost opt]# [ 3 \>=  3 ]&& echo "yes"
bash: [: >=: 期待二元表達(dá)式
[root@localhost opt]# 
[root@localhost opt]# who
root     :0           2019-11-26 08:16 (:0)
root     pts/0        2019-11-26 08:16 (:0)

[root@localhost opt]# 
[root@localhost opt]# who |wc -l
2
[root@localhost opt]# [ $(who |wc -l) -lt 5 ]&& echo "too less"
too less
[root@localhost opt]# [ $(who |wc -l) -ge 2 ]&& echo ">=2"
>=2

$()里面接命令 作用相當(dāng)于··反撇符號(hào)

[root@localhost opt]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1984         686          81           9        1216        1060
Swap:          2047           0        2047
[root@localhost opt]# free -m | grep Mem
Mem:           1984         686          81           9        1216        1060
[root@localhost opt]# free -m | grep Mem | awk '{print $1,$3,$4}'
Mem: 686 81
[root@localhost opt]# free -m | grep Mem | awk '{print $4}'
79
[root@localhost opt]# abc=$(free -m | grep Mem |awk '{ print $4 }')
[root@localhost opt]# echo abc
abc
[root@localhost opt]# echo $abc
77
[root@localhost opt]# [ $abc -gt 1024 ]&& echo "yes"
[root@localhost opt]# [ $abc -gt 50 ]&& echo "yes"
yes

1.3.1 字符串比較

  • 格式1:

    [ 字符串1 = 字符串2 ]
    [ 字符串1 != 字符串2 ]
  • 格式2:

    [ -z 字符串 ]

1.3.2 常用的測試操作符

  • = :字符串內(nèi)容相同
  • != :字符串內(nèi)容不同,!表示相反的意思
  • -z : 字符串內(nèi)容為空
  • 字符串需要用雙引號(hào)標(biāo)出來

1.3.3 演示

[root@localhost opt]# echo $LANG
zh_CN.UTF-8
[root@localhost opt]# [ $LANG = "zh_CN.UTF-8" ]&& echo "yes"
yes
[root@localhost opt]# [ $LANG != "zh_CN.UTF-8" ]&& echo "yes"
[root@localhost opt]# echo $?
1
[root@localhost opt]# [ "男" != "男" ]&& echo "yes"
[root@localhost opt]# [ "男" = "男" ]&& echo "yes"
yes
[root@localhost opt]# [ "男" = "女" ]&& echo "yes"
[root@localhost opt]# [ "男" != "女" ]&& echo "yes"
yes

理論 : shell編程之條件語句————理論講解

中括號(hào)內(nèi)為測試語句,可以進(jìn)行比較

是否創(chuàng)建/opt/share目錄:(yes/no) 創(chuàng)建成功

已經(jīng)存在

[root@localhost opt]# ls -al
總用量 16
drwxr-xr-x.  5 root root 156 11月 26 13:51 .
dr-xr-xr-x. 17 root root 224 10月 23 13:41 ..
'drwxr-xr-x.  2 root root   6 11月 26 13:51 abc
drwxr-xr-x.  2 root root   6 3月  26 2015 rh
-rw-r--r--.  1 root root   0 11月 26 13:51 test.txt
[root@localhost opt]# mv test.txt test.sh
[root@localhost opt]# vim test.sh 
#!/bin/bash
read -p "是否創(chuàng)建/opt/share目錄:(yes/no)" ack
[ $ack = "yes" ]&& mkdir /opt/share
echo "創(chuàng)建成功"
[root@localhost opt]# sh test.sh 
是否創(chuàng)建/opt/share目錄:(yes/no)yes
創(chuàng)建成功
[root@localhost opt]# ls
abc                    share          test.sh         
rh               
[root@localhost opt]# vim test.sh 
#!/bin/bash
read -p "是否創(chuàng)建/opt/demo目錄:(yes/no)" ack
[ -d /opt/demo ]&&echo "/opt/demo已經(jīng)存在" || mkdir /opt/demo && echo "/opt/demo創(chuàng)建成功"
[root@localhost opt]# sh test.sh 
是否創(chuàng)建/opt/demo目錄:(yes/no)yes
/opt/demo創(chuàng)建成功
[root@localhost opt]# sh test.sh 
是否創(chuàng)建/opt/demo目錄:(yes/no)yes
/opt/demo已經(jīng)存在
/opt/demo創(chuàng)建成功

一元運(yùn)算符:

i=1;

i=i++ 等同于i=$i+1 ,代表先賦值,再加加,即并沒有重新賦值

i=++i 先加再賦值 ,把得到的結(jié)果再去賦值,此時(shí)的加加就有了意義

[root@localhost opt]# i=1
[root@localhost opt]# echo $i
1
[root@localhost opt]# i++
bash: i++: 未找到命令...
[root@localhost opt]# i++;
bash: i++: 未找到命令...
[root@localhost opt]# expr i++
i++
[root@localhost opt]# let i++
[root@localhost opt]# echo $i
2
[root@localhost opt]# let i=i++
[root@localhost opt]# echo $i
2
[root@localhost opt]# let i++
[root@localhost opt]# echo $i
3
[root@localhost opt]# let ++i
[root@localhost opt]# echo $i
4
[root@localhost opt]# let i=++i
[root@localhost opt]# echo $i
5
[root@localhost opt]# let i=i++
[root@localhost opt]# echo $i
5
[root@localhost opt]# let i=++i
[root@localhost opt]# echo $i
6
[root@localhost opt]# let i=i+
bash: let: i=i+: 語法錯(cuò)誤: 期待操作數(shù) (錯(cuò)誤符號(hào)是 "+")
[root@localhost opt]# let i=i++
[root@localhost opt]# echo $i
6
[root@localhost opt]# let i+=2
[root@localhost opt]# echo $i
8
[root@localhost opt]# 
[root@localhost opt]# i\*=2
bash: i*=2: 未找到命令...
[root@localhost opt]# let i\*=2
[root@localhost opt]# echo $i
16
[root@localhost opt]# let i/=2
[root@localhost opt]# echo $i
8
[root@localhost opt]# let i%=2
[root@localhost opt]# echo $i
0
[root@localhost opt]# echo $i
0
[root@localhost opt]# 

二元運(yùn)算符

a+b=c

三元運(yùn)算符

條件&&結(jié)果1||結(jié)果2

條件成立執(zhí)行結(jié)果1,不成立執(zhí)行結(jié)果2

1.4.1 邏輯測試

格式1:

[ 表達(dá)式1 ] 操作符 [ 表達(dá)式2 ] ···

格式2:

命令1 操作符 命令2 ·······

1.4.2 常用的測試操作符

  • -a或&& :邏輯與,“而且”的意思
  • -o或|| :邏輯或,“或者”的意思
  • ! :邏輯否,代表取反含義
[root@localhost opt]# [ -d /etc ]&& [ -r /etc ]&&echo "you can open /etc this diretory"
you can open /etc this diretory
[root@localhost opt]# [ -d /etc ]|| [ -d /home ]&& echo "ok"
ok
[root@localhost opt]# [ -r /etc ]|| [ -d /home ]&& echo "ok"
ok
[root@localhost opt]# [ -r /etc ]|| [ -r /home ]&& echo "ok"
ok
[root@localhost opt]# [ -f /etc ]|| [ -f /home ]&& echo "ok"
[root@localhost opt]# echo $?
1
[root@localhost opt]# [ ! -f /etc ]|| [ -f /home ]&& echo "ok"
ok

二 : if語句的結(jié)構(gòu)

2.1 單分支結(jié)構(gòu)

理論 : shell編程之條件語句————理論講解

fi結(jié)束判斷,exit 0正常退出,exit 1異常退出

2.2 雙分支結(jié)構(gòu)

理論 : shell編程之條件語句————理論講解

理論 : shell編程之條件語句————理論講解

2.3 多分支結(jié)構(gòu)

理論 : shell編程之條件語句————理論講解

理論 : shell編程之條件語句————理論講解

三 : if語句應(yīng)用實(shí)例

3.1 單分支if語句

  • 判斷掛載點(diǎn)目錄,若不存在則自動(dòng)創(chuàng)建
    理論 : shell編程之條件語句————理論講解
    
    [root@localhost opt]# vim test02.sh
    #!/bin/bash
    dir="/opt/demo02"
    if [ ! -d $dir ]
    then
    mkdir -p $dir
    echo "$dir創(chuàng)建成功"
    fi
    [root@localhost opt]# sh test02.sh 
    /opt/demo02創(chuàng)建成功
    [root@localhost opt]# ls
    [root@localhost opt]# ls
    abc                    share          test.sh         
    rh                     demo02 
    [root@localhost opt]# vim test02.sh
    #!/bin/bash
    dir="/opt/demo02"
    if [ ! -d $dir ]
    then
    mkdir -p $dir
    echo "$dir創(chuàng)建成功"
    else
    echo "$dir已存在"
    fi
    [root@localhost opt]# sh test02.sh 
    /opt/demo02已存在

## 3.2 雙分支if語句

- 判斷目標(biāo)主機(jī)是否存活,顯示檢測結(jié)果

- ping -c 發(fā)送包個(gè)數(shù) -i 間隔時(shí)間,單位s,-W 等待3s

  $1 位置變量ip地址,把結(jié)果混合輸出到null中

  上一條結(jié)果若是等于0,成立,則輸出up,else就會(huì)down

![](https://s1.51cto.com/images/blog/201911/26/a02e04631aec4534762c49c2f54bbe34.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

請(qǐng)輸入IP地址:

```shell
[root@localhost opt]# vim test02.sh
#!/bin/bash
read -p "請(qǐng)輸入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
[root@localhost opt]# sh test02.sh 
請(qǐng)輸入IP地址:192.168.139.132
192.168.139.132 is up
[root@localhost opt]# sh test02.sh 
請(qǐng)輸入IP地址:139.168.139.133
139.168.139.133 is down
[root@localhost opt]# 

3.3 多分支語句

理論 : shell編程之條件語句————理論講解

elif 否則 如果

exit 1 異常退出

[root@localhost opt]# vim fenshu.sh
#!/bin/bash
read -p "請(qǐng)輸入您的分?jǐn)?shù)" score
if [ $score -lt 0 ]
 then
   echo "你已經(jīng)沒救了"
elif [ $score -gt 100 ]
 then
   echo "別做夢(mèng)"
elif [ $score -ge 85 ]
 then
   echo "成績優(yōu)秀"
elif [ $score -lt 70 ]
 then
   echo "不及格,還要好好努力啊少年"
else
   echo "成績合格,不要就此止步,繼續(xù)努力!"
fi
~                               
[root@localhost opt]# sh fenshu.sh 
請(qǐng)輸入您的分?jǐn)?shù)-9
你已經(jīng)沒救了
[root@localhost opt]# sh fenshu.sh 
請(qǐng)輸入您的分?jǐn)?shù)101
別做夢(mèng)
[root@localhost opt]# sh fenshu.sh 
請(qǐng)輸入您的分?jǐn)?shù)90
成績優(yōu)秀
[root@localhost opt]# sh fenshu.sh 
請(qǐng)輸入您的分?jǐn)?shù)60
不及格,還要好好努力啊少年

理論 : shell編程之條件語句————理論講解

總結(jié):

  • 條件測試操作的語法
    • 文件測試、整數(shù)值比較、字符串比較、邏輯測試
  • 圖示if條件語句的語法
    • 單分支、雙分支、多分支

一個(gè)簡易的計(jì)算器

#!/bin/bash
read -p "請(qǐng)輸入一個(gè)整數(shù):" numb1
read -p "請(qǐng)選擇你需要的運(yùn)算;選項(xiàng):加(+)減(-)乘(x)除(/)取余 (%)" yunsuan
read -p "請(qǐng)輸入第二個(gè)整數(shù):" numb2
if [ "$yunsuan" = "+" ]
  then
  expr=`expr $numb1 + $numb2`
      echo "$numb1 + $numb2 = $expr"
elif [ "$yunsuan" = "-" ]
  then
  expr=`expr $numb1 - $numb2`
      echo "$numb1 - $numb2 = $expr"
elif [ "$yunsuan" = "x" ]
  then
  expr=`expr $numb1 \* $numb2`
      echo "$numb1 x $numb2 =  $expr"
elif [ "$yunsuan" = "/" ]
  then
  expr=`expr $numb1 / $numb2`
     echo "$numb1 / $numb2 = $expr"
else
  expr=`expr $numb1 % $numb2`
     echo "$numb1 % $numb2 = $expr"  
fi
~                                                                                           
~ 
[root@localhost opt]# sh jisuanqi.sh 
請(qǐng)輸入一個(gè)整數(shù):10
請(qǐng)選擇你需要的運(yùn)算;選項(xiàng):加(+)減(-)乘(x)除(/)取余 (%)+
請(qǐng)輸入第二個(gè)整數(shù):8
10 + 8 = 18
[root@localhost opt]# vim jisuanqi.sh
[root@localhost opt]# sh jisuanqi.sh 
請(qǐng)輸入一個(gè)整數(shù):10
請(qǐng)選擇你需要的運(yùn)算;選項(xiàng):加(+)減(-)乘(x)除(/)取余 (%)-
請(qǐng)輸入第二個(gè)整數(shù):5
10 - 5 = 5
[root@localhost opt]# sh jisuanqi.sh 
請(qǐng)輸入一個(gè)整數(shù):10
請(qǐng)選擇你需要的運(yùn)算;選項(xiàng):加(+)減(-)乘(x)除(/)取余 (%)x
請(qǐng)輸入第二個(gè)整數(shù):2
[root@localhost opt]# sh jisuanqi.sh 
請(qǐng)輸入一個(gè)整數(shù):17
請(qǐng)選擇你需要的運(yùn)算;選項(xiàng):加(+)減(-)乘(x)除(/)取余 (%)%
請(qǐng)輸入第二個(gè)整數(shù):4
17 % 4 = 1
[root@localhost opt]# sh jisuanqi.sh 
請(qǐng)輸入一個(gè)整數(shù):10
請(qǐng)選擇你需要的運(yùn)算;選項(xiàng):加(+)減(-)乘(x)除(/)取余 (%)/
請(qǐng)輸入第二個(gè)整數(shù):5
10 / 5 = 2

作業(yè):田徑賽決賽名單 淘汰名單 姓名 性別 成績

[root@localhost opt]# vim tianjingsai.sh 
   1 #!/bin/bash
  2 fnan=/opt/nanzizujuesaimingdan
  3 fnv=/opt/nvzizujuesaimingdan
  4 ftao=/opt/taotaimingdan
  5 if [ ! -f $fnan ]&& [ ! -f $fnv ]&& [ ! -f $ftao ]
  6  then
  7  touch $fnan $fnv $tao
  8 fi
  9 read -p "請(qǐng)輸入(格式:姓名 性別 成績):" xingming  xingbie chengji
 10 if [ $chengji -lt 0 ]
 11 then
 12   echo "???你在輸什么??"
 13   exit 1
 14 elif [ $chengji -gt 0 ] && [ $chengji -lt 10 ]
 15 then
 16   echo "你的成績優(yōu)秀,可以進(jìn)入10秒內(nèi)決賽"
 17     if [ $xingbie = "nan" ]
 18       then
 19       echo "$xingming $xingbie $chengji" >> /opt/nanzizujuesaimingdan
 20     else
 21       echo "$xingming $xingbie $chengji" >> /opt/nvzizujuesaimingdan
 22     fi
 23 else
 24   echo "$xingming $xingbie $chengji" >> /opt/taotaimingdan
 25   echo "再加把勁,下次就是你了"
 26 
 27 fi
~         
[root@localhost opt]# sh tianjingsai.sh 
請(qǐng)輸入(格式:姓名 性別 成績):gsy nan 1
你的成績優(yōu)秀,可以進(jìn)入10秒內(nèi)決賽
[root@localhost opt]# sh tianjingsai.sh 
請(qǐng)輸入(格式:姓名 性別 成績):zzz nv 6
你的成績優(yōu)秀,可以進(jìn)入10秒內(nèi)決賽
[root@localhost opt]# sh tianjingsai.sh 
請(qǐng)輸入(格式:姓名 性別 成績):aaa nan -6
???你在輸什么??
[root@localhost opt]# sh tianjingsai.sh 
請(qǐng)輸入(格式:姓名 性別 成績):aaa nan 14
再加把勁,下次就是你了
[root@localhost opt]# ls
fenshu.sh             nvzizujuesaimingdan  taotaimingdan  test.sh         wwwroot
nanzizujuesaimingdan  rh                   test02.sh      tianjingsai.sh
[root@localhost opt]# cat nvzizujuesaimingdan 
zzz nv 6
[root@localhost opt]# cat nanzizujuesaimingdan 
gsy nan 1
[root@localhost opt]# cat taotaimingdan 
gsy nan 0.5
aaa nan 14

理論 : shell編程之條件語句————理論講解

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI