1. 程式人生 > >六十八、shell腳本中的邏輯判斷、文件目錄屬性判斷、if特殊用法、case判斷

六十八、shell腳本中的邏輯判斷、文件目錄屬性判斷、if特殊用法、case判斷

shell腳本中的邏輯判斷 文件目錄屬性判斷 if特殊用法 case判斷

六十八、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判斷