六十八、shell腳本中的邏輯判斷、文件目錄屬性判斷、if特殊用法、case判斷
一、shell腳本中的邏輯判斷
格式1:if 條件 ; then 語句; fi
格式2:if 條件; then 語句; else 語句; fi
格式3:if …; then … ;elif …; then …; else …; fi
if:如果。
then:然後。
-gt:大於。
-lt:小於。
-eq:等於。
-ne:不等於。noeq。
-ge:大於等於。
-le:小於等於。
格式1:如果滿足條件a大於3,則輸出ok。最常用。
# if [ $a -gt 3 ]; then echo ok; fi //這是用一行命令表示下方腳本
#!/bin/bash a=5 if [ $a -gt 3 ] then echo ok fi
# sh -x if1.sh //執行過程:5和3比較,大於3,輸出ok。 + a=5 + '[' 5 -gt 3 ']' + echo ok ok
格式2:若不滿足條件不大於3,則輸出nook
#!/bin/bash a=5 if [ $a -gt 3 ] then echo ok else echo nook fi
# sh -x if2.sh + a=2 + '[' 2 -gt 3 ']' + echo nook nook
格式3:不滿足第一個條件,但是滿足第二個條件。
#!/bin/bash a=2 if [ $a -gt 4 ] then echo ">1" elif [ $a -lt 3 ] then echo "<3 && >4" else echo nook fi
# sh -x if3.sh + a=2 + '[' 2 -gt 4 ']' + '[' 2 -lt 3 ']' + echo '<3 && >4' <3 && >4
邏輯判斷表達式:if [ $a -gt $b ]; if [ $a -lt 5 ]; if [ $b -eq 10 ]等 -gt (>); -lt(<); -ge(>=); -le(<=);-eq(==); -ne(!=) 註意到處都是空格
可以使用 && ,|| 結合多個條件。
&&:並且。
||:或者。
if [ $a -gt 5 ] && [ $a -lt 10 ]; then
if [ $b -gt 5 ] || [ $b -lt 3 ]; then
二、文件目錄屬性判斷
[ -f file ]判斷是否是普通文件,是否存在
[ -d file ] 判斷是否是目錄,是否存在
[ -e file ] 判斷文件或目錄是否存在
[ -r file ] 判斷文件是否可讀
[ -w file ] 判斷文件是否可寫
[ -x file ] 判斷文件是否可執行
#!/bin/bash f="/tmp/aminglinux" if [ -f $f ] then echo $f exist else touch $f fi
# sh -x file.sh //第一次判斷,沒有這個文件,會創建這個文件
+ f=/tmp/aminglinux + '[' -f /tmp/aminglinux ']' + touch /tmp/aminglinux
# sh -x file.sh //第二次判斷,有這個文件,直接輸出這個文件
+ f=/tmp/aminglinux + '[' -f /tmp/aminglinux ']' + echo /tmp/aminglinux exist /tmp/aminglinux exist
#!/bin/bash f="/tmp/aminglinux" [ -f /tmp/aminglinux ] && rm -f $f
判斷前面的文件是否存在,如果存在,就刪除它。 if [ -f $f ] then rm -f $f fi
[ -f /tmp/aminglinux ] && rm -f $f //這一句等於上面四句。
[ -f $f ] || touch $f //當前面的命令執行不成功時,才執行後面的命令。等同於下面的四句。! -f 取反。當這個文件不存在,就touch。
if [ ! -f $f ]
then
touch $f
fi
三、if特殊用法
if [ -z "$a" ] 這個表示當變量a的值為空時會怎麽樣
if [ -n "$a" ] 表示當變量a的值不為空,不為空,條件成立。
! -z = -n
! -n = -z 它們的關系是相對的
使用-z和-n判斷時,變量用雙引號括起來,文件就不用。
使用該用法時,後面就不要用elif了,沒有意義,應該用else。
#!/bin/bash n='/tmp/lala' if [ -z "$n" ] then echo no exit else echo "12345" >> "/tmp/lala" fi
如果用elif像下面這樣寫,就不對,因為前面是文件,後面用elif就只能和數字對比做判斷,因為文件和數字不能對比,所以會報錯,直接用else,然後touch文件或者追加什麽的:
# if [ -n /tmp/lala ];then echo okk; fi
#!/bin/bash n='/tmp/lala' if [ -z "$n" ] then echo no exit elif [ $n -gt 10 ] then echo yes fi
if grep -q '123' 1.txt; then 表示如果1.txt中含有'123'的行時會怎麽樣
-w:更加精準的匹配。
-q:過濾,但是不把過濾的內容顯示出來。
# if grep -wq 'user1' /etc/passwd; then echo "user1 exist"; fi
if [ ! -e file ]; then 表示文件不存在時會怎麽樣
!:取反,感嘆號。
if (($a<1)); then …等同於 if [ $a -lt 1 ]; then…
[ ] 中不能使用<,>,==,!=,>=,<=這樣的符號
四、case判斷
格式 case 變量名($a) in
value1)
command
;;
value2)
command
;;
*)
commond
;;
esac
在case程序中,可以在條件中使用|,表示或的意思, 比如
value2|value3)
command
;;
每個判斷裏面以雙分號結束,代表判斷結束,進入下一個判斷。
當執行status時,會執行它下面的語句,當執行restart或者reload或者force-reload時,會執行它下面的語句,當執行其他的命令時,執行“*”下面的語句。
# read -p "Please input a number: " n read -p的作用:比如給n賦值,輸入什麽就是什麽。
Please input a number: 12345
# echo $n
12345
shell腳本案例:
#!/bin/bash read -p "Please input a number: " n if [ -z "$n" ] then echo "Please input a number." exit 1 //退出來,返回一個數值 fi n1=`echo $n|sed 's/[0-9]//g'` 判斷輸入的變量是不是純數字 if [ -n "$n1" ] then echo "Please input a number." 輸入一個純數字 exit 1 再退出來 fi if [ $n -lt 60 ] && [ $n -ge 0 ] $n小於60並且大於等於0 then tag=1 先用tag=1做標記 elif [ $n -ge 60 ] && [ $n -lt 80 ] $n大於60小於80用tag=2標記 then tag=2 elif [ $n -ge 80 ] && [ $n -lt 90 ] $n大於等於80並且小於90用tag=3標記 then tag=3 elif [ $n -ge 90 ] && [ $n -le 100 ] $n大於等於90並且小於等於100用tag=4表示 then tag=4 else 不是這些情況的tag=0 tag=0 fi case $tag in 1) echo "not ok" ;; 2) echo "ok" ;; 3) echo "ook" ;; 4) echo "oook" ;; *) echo "The number range is 0-100." ;; esac
測試1:
# sh -x case.sh + read -p 'Please input a number: ' n Please input a number: 101 + '[' -z 101 ']' //先判斷這個變量是不是存在 ++ echo 101 ++ sed 's/[0-9]//g' //存在之後,做一個判斷,把數字清空,然後n1為空 + n1= + '[' -n '' ']' //判斷它是否不為空,不為空就正常,然後往下走,一個個比對判斷。 + '[' 101 -lt 60 ']' + '[' 101 -ge 60 ']' + '[' 101 -lt 80 ']' + '[' 101 -ge 80 ']' + '[' 101 -lt 90 ']' + '[' 101 -ge 90 ']' + '[' 101 -le 100 ']' + tag=0 //所有條件都不滿足,最後tag=0 + case $tag in //tag=0沒有在1234裏面的時候,就返回*號的輸出。 + echo 'The number range is 0-100.' The number range is 0-100.
測試2:
# sh -x case.sh + read -p 'Please input a number: ' n Please input a number: 65 + '[' -z 65 ']' ++ echo 65 ++ sed 's/[0-9]//g' + n1= + '[' -n '' ']' + '[' 65 -lt 60 ']' + '[' 65 -ge 60 ']' + '[' 65 -lt 80 ']' + tag=2 + case $tag in //大於60並且小於80,直接判定tag=2 + echo ok ok
六十八、shell腳本中的邏輯判斷、文件目錄屬性判斷、if特殊用法、case判斷