一、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 腳本中,一般會根據上一個命令的 $? 值來進行一些流程控制;