70:shell腳本中的邏輯判斷(文件目錄屬性判斷、if判斷、case用法)

一、shell腳本中的邏輯判斷語法shell

格式1:if  條件 ; then   語句 ;  fi vim

格式2:if  條件 ; then   語句;   else   語句;fi   bash

格式3:if  條件;  then   語句;elif   條件;then 語句;else   語句;fispa

邏輯判斷表達式:if [ $a -gt $b ];if  [ $a -lt 5 ];if [ $b -eq 10 ]等:code

-gt ( > )   -lt ( < )  -ge (>=)  -lt(<=)  -eq(=)  -ne(不等於 !=)input

可使用 &&(而且)  ||(或者) 結合多個條件來判斷:it

if  [ $a -gt 5 ] ||  [ $a -lt 19 ];thenclass

if  [ $b -ge 5 ] && [ $b -lt 10 ];then變量

shell腳本實踐:sed

1:for語句循環: for  i in  `seq 1 5`

[root@localhost_02 ~]# for i in `seq 1 5`;do echo $i;done
1
2
3
4
5
[root@localhost_02 ~]# for i in `seq 1 5`
> do 
> echo $i
> done
1
2
3
4
5

2:if判斷裏面第一種格式:   if   條件 ;then 語句;fi

[root@localhost_02 shell]# cat if.sh 
#!/bin/bash
a=3
if [ $a -gt 2 ]
then
    echo ok
fi
[root@localhost_02 shell]# sh if.sh 
ok

3:if判斷裏的第二種格式:if  條件;then 語句;else  語句;fi

[root@localhost_02 shell]# cat if2.sh 
#!/bin/bash
a=5
if [ $a -lt 3 ]
then 
    echo ok
else 
    echo nook
fi
[root@localhost_02 shell]# sh if2.sh 
nook

4:if判斷力的第三種格式:if 條件;then 語句;elif  條件 then 語句 else 語句;fi

[root@localhost_02 shell]# cat if3.sh 
#!/bin/bash
a=8
if [ $a -gt 10 ]
then 
   echo ">10"
elif [ $a -gt 5 ] || [ $a -lt 10 ]
then
   echo ">5 && <10"
else
   echo nook
fi
   
[root@localhost_02 shell]# sh -x if3.sh 
+ a=8
+ '[' 8 -gt 10 ']'
+ '[' 8 -gt 5 ']'
+ echo '>5 && <10'
>5 && <10

註釋:在一個腳本里,elif能夠寫多個的,else是除去定義以外的其餘條件:

若要使用符號(<>=)等,可使用以下:

[root@localhost_02 shell]# a=3
[root@localhost_02 shell]# if (($a>2));then echo ok;fi
ok

註釋:邏輯判斷表達式:

-gt(>)  大於    -lt(<)  小於    -ge(>=)   大於等於   -le(<=)  小於等於   -eq(=)  等於    -ne(!=)   不等於

二、 if 判斷文件目錄、屬性

[ -f  file ]:判斷是否爲普通文件,且存在:

[ -d file ]:判斷是不是目錄,且存在:

[ -e file ]:判斷文件或目錄是否存在(能夠是文件或者目錄):

[ -r file ]:判斷文件是否可讀:

[ -w file ]:判斷文件是否可寫:

[ -x file ]:判斷文件是否可執行:

[ -z 變量 ]:判斷變量是否爲空:

實踐

if [ -f file ] 判斷是否爲普通文件且存在:

[root@localhost_02 shell]# cat if5.sh    #判斷f是不是文件且存在,不存在則建立:
#!/bin/bash
f='/tmp/fenye'
if [ -f $f ]
then 
   echo $f exist
else 
  touch $f
fi
[root@localhost_02 shell]# sh -x if5.sh     #第一次運行時,不存在則建立:
+ f=/tmp/fenye
+ '[' -f /tmp/fenye ']'
+ touch /tmp/fenye

[root@localhost_02 shell]# sh if5.sh       #第二次運行時,提示文件已存在:
/tmp/fenye exist

if [ -d file ]  判斷是否爲目錄,且存在:

[root@localhost_02 shell]# cat if6.sh 
#!/bin/bash
d='/tmp/fenye'
if [ -d $d ]
then
   echo $d exits;
else
   mkdir $d
fi
[root@localhost_02 shell]# sh -x if6.sh
+ d=/tmp/fenye
+ '[' -d /tmp/fenye ']'
+ mkdir /tmp/fenye
mkdir: 沒法建立目錄"/tmp/fenye": 文件已存在

註釋:文件和文件均可以touch 的,touch的目的是若是這個文件或目錄不存在,它會建立這個文件,若是這個文件或目錄存在了,在touch 就會更改這個文件的三個 time:

if [ -e  file] 判斷文件或目錄是否存在:

[root@localhost_02 shell]# cat if7.sh 
#!/bin/bash
if [ -e /tmp/fenye ]
then
   echo file is exist;
else
   touch $d
fi
[root@localhost_02 shell]# sh if7.sh
file is exist

if [ -r file ] 判斷文件是否可讀:

[root@localhost_02 shell]# cat if7.sh
#!/bin/bash
d='/tmp/fenye'
if [ -r $d ]
then
   echo file is read;
fi
[root@localhost_02 shell]# sh -x if7.sh
+ d=/tmp/fenye
+ '[' -r /tmp/fenye ']'
+ echo file is read
file is read

if  [ -w file ] 判斷文件是否可寫:

[root@localhost_02 shell]# cat if8.sh
#!/bin/bash
d='/tmp/fenye'
if [ -w $d ]
then 
   echo file $d is writ;
fi
[root@localhost_02 shell]# sh -x if8.sh
+ d=/tmp/fenye
+ '[' -w /tmp/fenye ']'
+ echo file /tmp/fenye is writ
file /tmp/fenye is writ

註釋:經過去判斷文件的可讀可寫,就能夠判斷當前執行shell腳本的是那個用戶:

[root@localhost_02 shell]# cat if8.sh 
#!/bin/bash
d='/tmp/fenye'
if [ -x $d ]
then 
   echo file $d is writ;
else
   echo file $d no exec;
fi

[root@localhost_02 shell]# sh -x if8.sh
+ d=/tmp/fenye
+ '[' -x /tmp/fenye ']'
+ echo file /tmp/fenye no exec
file /tmp/fenye no exec

使用經常使用的:      && 而且                                     或者 ||

[root@localhost_02 shell]# cat if9.sh 
#!/bin/bash
f='/tmp/fenye'
[ -f $f ] && rm -fr &f     #前面的命令執行成功,纔會執行後面的命令;
等同於下面的表達式:
if [ -f $f ]
then 
   rm -fr $f;
fi
[root@localhost_02 shell]# cat if10.sh
#!/bin/bash
f='/tmp/fenye'
[ ! -f $f ] || touch $f            #表示前面的命令執行不成功,纔會執行後面的命令;
等同於下面的命令:
if [ -f $f ]                        #表示第一條命令執行不成功,纔會往下執行;
then
   touch $f
fi

if 判斷的一些特殊用法

if  [ -z  $a ]   表示當判斷變量a的值爲空時會怎麼樣:

if  [ -n $a ]    表示當判斷變量a的值不爲空會怎麼樣:

if  grep  -q  "123" passwd;then  表示判斷passswd文本中含有123的行時會怎麼樣:

if  [ ! -e file ]  表示文件不存在時則怎麼樣:

if (($a>5));then.....  等同於   if  [ $a -gt 5 ];then .....

[ ]中不能使用<,>,==,!=,>=,<=這樣的符合(須要結合兩個圓括號使用):

實踐:

註釋 -z 或者 -n 不能做用在文件上,只能做用在變量上:兩個正好相反:建議使用這兩個參數時變量都加上雙引號

!-z === -n

!-n === -z

[root@localhost_02 shell]# cat if11.sh 
#!/bin/bash
n=`wc -l /tmp/lala`
if [ -z "$n" ]
   then 
echo error
   exit
elif [ $n -gt 100 ]
then 
   echo abck
fi 
[root@localhost_02 shell]# sh -x if11.sh 
++ wc -l /tmp/lala
wc: /tmp/lala: 沒有那個文件或目錄
+ n=
+ '[' -z '' ']'
+ echo error
error
+ exit

改良後:加入判斷:

[root@localhost_02 shell]# cat if12.sh 
#!/bin/bash
if [ -f tmp/lala ]
   then 
   echo "The /tmp/lala not exits"
   exit
fi
n=`wc -l /tmp/lala`
if [ -z "$n" ]
   then 
   echo error
   exit
elif [ $n -gt 100 ]
   then 
   echo adbc
fi
[root@localhost_02 shell]# sh  if12.sh
wc: /tmp/lala: 沒有那個文件或目錄

[ -n $a ]  判斷變量不爲空時發生什麼:   等同於  ! -z 

註釋:用 「-n」選項時,若是是變量時,則要用雙引號引發了,若是是文件則不須要:(通常不能做用在文件上)

[root@localhost_02 shell]# a=1
[root@localhost_02 shell]# if [ -n "$a" ];then echo ok;else echo nook;fi   #a聲明瞭變量:
ok
[root@localhost_02 shell]# if [ -n "$b" ];then echo ok;else echo nook;fi   #b沒有聲明變量:
nook

3: 在邏輯判斷中,有時候還可使用一個命令的結果做爲判斷條件:   

判斷某個文件中是否含有某個字符:(某個系統中是否含有某個用戶):  

grep  -wq  "zabbix" /etc/passwd

-w:後面跟單詞,表示精確匹配後面的單詞:                                 -q:表示靜默輸出,僅僅過濾,不輸出結果,通常用於腳本中:

[root@localhost_02 shell]# if grep -wq "zabbix" /etc/passwd;then echo zabbix exist;else echo zabbix not exist; fi
zabbix exist

如上:判斷zabbix用戶是否存在:

也或者,有時想用戶不存在,則建立這個用戶,直接取反,以下:

[root@localhost_02 shell]# if ! grep -wq "fenye" /etc/passwd;then useradd fenye;else zabbix exits;fi
[root@localhost_02 shell]# grep "fenye" /etc/passwd
fenye:x:1002:1002::/home/fenye:/bin/bash

四、case判斷:格式以下:

case 變量名  in 
      value1)
         commond
         ;;
      value2)
         commond
         ;;
      *)
         commond
         ;;
       esac

註釋:在case程序中,能夠在條件中使用 | ,表示或的意思,好比:

‘2|3')  
     commond 
     ;;

shell腳本案例:輸入成績:

[root@localhost_02 shell]# vim case1.sh 
#!/bin/bash
read -p "Please input number : " n
if [ -z "$n" ]
then 
   echo "Please input number"
   exit 1
fi
n1=`echo $n|sed 's/[0-9]//g'`
if [ ! -z "$n1" ]
then
   echo "Please input a muber"
   exit 1
fi
if [ $n -le 60 ] && [ $n -gt 0 ]
then
    tag=1
elif [ $n -le 80 ] && [ $n -gt 60 ]
then 
    tag=2
elif [ $n -le 90 ] && [ $n -gt 80 ]
then
    tag=3
elif [ $n -le 100 ] && [ $n -gt 90 ]
then
    tag=4
else
    tag=0
fi
case $tag in 
     1)
          echo 「不及格」
     ;;
     2)
          echo "及格"
     ;;
     3)
          echo "良好"
     ;;
     4)
          echo "優秀"
     ;;
     *)
          echo "The is number range is 0-100"
     ;;
esac
[root@localhost_02 shell]# sh case1.sh 
Please input number : 50
「不及格」
[root@localhost_02 shell]# sh case1.sh 
Please input number : 90
良好
[root@localhost_02 shell]# sh case1.sh 
Please input number : 101
The is number range is 0-100

註釋:

shell 中 exit0 exit1 的區別: exit(0):正常運行程序並退出程序; exit(1):非正常運行致使退出程序; exit 0 能夠告知你的程序的使用者:你的程序是正常結束的。若是 exit 非 0 值,那麼你的程序的使用者一般會認爲你的程序產生了一個錯誤。 在 shell 中調用完你的程序以後,用 echo $? 命令就能夠看到你的程序的 exit 值。在 shell 腳本中,一般會根據上一個命令的 $? 值來進行一些流程控制;

相關文章
相關標籤/搜索