1. 程式人生 > >20.5-20.9 shel:l腳本中的邏輯判斷,文件目錄屬性判斷,if特殊用法 ,case判斷

20.5-20.9 shel:l腳本中的邏輯判斷,文件目錄屬性判斷,if特殊用法 ,case判斷

shell shell腳本 邏輯判斷 case判斷 if特殊用法

20.5 shell腳本中的邏輯判斷


不帶else

格式1:if 條件 ; then 語句; fi(這種格式常用)

解釋:如果滿足條件,然後怎樣,最後怎樣

實例:

1 命令行形式表示

[root@AliKvn ~]# a=5

[root@AliKvn ~]# if [ $a -gt 3 ]

> then

> echo ok

> fi

ok

[root@AliKvn ~]# if [ $a -gt 3 ]; then echo ok; fi


解釋:

-gt 3 表示大於3

整條參數的意思就是,如果a大於3,顯示ok.

上面2條參數都是同樣效果,分開寫就用上面的格式,一條命令的格式就參考下面的。


2 腳本形式表示

編寫腳本

[root@AliKvn shell]# vim if1.sh


#!/bin/bash

a=5

if [ $a -gt 3 ]

then

echo ok

fi


執行

[root@AliKvn shell]# sh if1.sh

ok


帶有else,表示否則。

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

解釋:如果滿足條件,然後怎樣;如果不滿足條件,然後怎樣。

實例:

1 編寫腳本

a=1,大於3就ok,否則,no.

[root@AliKvn shell]# vim if2.sh


#!/bin/bash

a=1

if [ $a -gt 3 ]

then

echo ok

else

echo no

fi


2 執行過程

[root@AliKvn shell]# sh -x if2.sh

+ a=1 a=1

+ '[' 1 -gt 3 ']' 1與3比較,不滿足>3條件,

+ echo no 但是滿足腳本中的else

no 所以最後輸出結果是no


帶有elif,附件條件,同個腳本可以寫多個elif

格式3:if …; then … ;elif …; then …; else …; fi

解釋:

實例:

1 編寫腳本

[root@AliKvn shell]# vim if3.sh


#!/bin/bash

a=3

if [ $a -gt 4 ]

then

echo ">1"

elif [$a -gt 6]

then

echo "<6 && >1"

else

echo no

fi



參數解釋:

elif [$a -gt 6] 而且a>6,

then

echo "<6 && >1" 則輸出結果:<6 && >1


2 執行過程

[root@AliKvn shell]# sh -x if3.sh

+ a=3

+ '[' 3 -gt 4 ']'

+ '[' 3 -gt 6 ']'

+ echo no

no


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

大於小於等於等說明:-gt (>); -lt(<); -ge(>=); -le(<=);-eq(==); -ne(!=) 註意到處都是空格

大於小於等於也可以用這種方法表示,

[root@AliKvn shell]# a=3

[root@AliKvn shell]# if ((a>1)); then echo ok; fi

ok


可以使用 && || 結合多個條件(&&並且,||或者)

if [ $a -gt 5 ] && [ $a -lt 10 ]; then

if [ $b -gt 5 ] || [ $b -lt 3 ]; then


20.6 文件目錄屬性判斷


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

實驗

1 編寫腳本

[root@AliKvn shell]# !vim

vim file-f.sh


#!/bin/bash

f="/tmp/shell-f.test"

if [ -f $f ]

then

echo $f exist.

else

touch $f

fi


解釋:

f="/tmp/shell-f.test" 變量f=/tmp/shell-f.test這個文件,

if [ -f $f ] 如果它是個文件,

then

echo $f exist. 輸出$f變量exist

else 否則

touch $f 創建$f文件

fi

2 執行腳本查看進度

[root@AliKvn shell]# sh -x file-f.sh

+ f=/tmp/shell-f.test

+ '[' -f /tmp/shell-f.test ']'

+ echo /tmp/shell-f.test exist.

/tmp/shell-f.test exist.





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

編寫腳本

[root@AliKvn shell]# vim file-d.sh


#!/bin/bash

f="/tmp/shell-f.test"

if [ -d $f ]

then

echo $f exist.

else

touch $f

fi


解釋:

if [ -d $f ] -d判斷變量$f是否目錄

touch $f 目錄和文件都可以進行touch的。touch$f,如果存在,也不影響操作,只影響time


2 執行腳本查看進度

[root@AliKvn shell]# sh -x file-d.sh

+ f=/tmp/shell-f.test

+ '[' -d /tmp/shell-f.test ']'

+ touch /tmp/shell-f.test


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

1 編寫腳本,

[root@AliKvn shell]# !vim

vim file-d.sh


#!/bin/bash

f="/tmp/shell-f.test"

if [ -e $f ]

then

echo $f exist.

else

touch $f

fi


2 執行腳本查看進度

[root@AliKvn shell]# sh -x !$

sh -x file-d.sh

+ f=/tmp/shell-f.test

+ '[' -e /tmp/shell-f.test ']'

+ echo /tmp/shell-f.test exist.

/tmp/shell-f.test exist.


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

1 編寫腳本

[root@AliKvn shell]# !vim

vim file-d.sh


#!/bin/bash

f="/tmp/shell-f.test"

if [ -r $f ]

then

echo $f readable

else

echo $f unreadable

fi


2 執行腳本

[root@AliKvn shell]# sh file-d.sh

/tmp/shell-f.test readable



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

[root@AliKvn shell]# !vim

vim file-d.sh


#!/bin/bash

f="/tmp/shell-f.test"

if [ -r $f ]

then

echo $f writeable

else

echo $f unwriteable

fi


2 執行腳本

[root@AliKvn shell]# sh file-d.sh

/tmp/shell-f.test writeable


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

註意,執行判斷腳本的可讀可寫可執行狀態,只針對當前用戶



#vim file-d.sh


#!/bin/bash

f="/tmp/shell-f.test"

if [ -r $f ]

then

echo $f writeable

else

echo $f unwriteable

fi


[root@AliKvn shell]# !vim

vim file-d.sh


#!/bin/bash

f="/tmp/shell-f.test"

if [ -f $f ]

then

rm -f $f

fi

以上腳本,倒數4條的內容,等同於這條參數[ -f $f ] && rm -f $f

&&表示前面的執行有效,後面才接著執行。

[ -f $f ] || touch $f

||表示或者,前者命令是否定答案,才執行後者命令。


以上都是用了如果存在的條件,

要表示如果文件不存在,應該是[! -f $f] !表示非,取反,否定意義。


總結:

if 判斷文件、目錄屬性

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

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

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

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

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

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


20.7 if特殊用法

if判斷的一些特殊用法

if [ -z "$a" ] 這個表示當變量a的值為空時會怎麽樣。它與if [ -n "$a" ]是相對的,相反的。if [ -n "$a" ]=if [ ! -z "$a" ],他們是相同的。

1 編寫腳本,

[root@AliKvn shell]# vim shell20-7.sh


#!/bin/bash

n=`wc -l /tmp/lalal` n的值為統計文件的行數

if [ -z "$n" ] 如果n的值為空(或者文件是不存在)

then

echo error 輸出error

exit 然後退出

elif [ $n -gt 1000 ] 如果輸出結果大於1000

then

echo ljfiwo 輸出ljfiwo

fi


2 執行腳本並輸出,略亂

[root@AliKvn shell]# sh -x shell20-7.sh

++ wc -l /tmp/lalal

wc: /tmp/lalal: No such file or directory

+ n=

+ '[' -z '' ']'

+ echo error

error

+ exit


3 這個腳本還可以更完美


[root@AliKvn shell]# !vim

vim file-f.sh


#!/bin/bash

if [ ! -f /tmp/lalal ] 判斷/tmp/lalal是否非文件並判斷是否非存在,

then 條件成立則

echo "/tmp/lalal not exist." 輸出結果

exit 退出操作

fi 結束



f="/tmp/shell-f.test"

if [ -f $f ]

then

echo $f exist.

else

touch $f

fi


4 執行腳本

[root@AliKvn shell]# !vim

vim file-f.sh

[root@AliKvn shell]# sh -x !$

sh -x file-f.sh

+ '[' '!' -f /tmp/lalal ']'

+ echo '/tmp/lalal not exist.'

/tmp/lalal not exist.

+ exit

[root@AliKvn shell]# sh file-f.sh

/tmp/lalal not exist.


if [ -n "$a" ] 表示當變量a的值不為空。可以判斷文件,如果是字符串需要用雙引號引起,否則不用雙引號。

1 判斷文件用法(不用雙引號標註)

判斷01.sh是否存在

[root@AliKvn shell]# ls

01.sh file-d.sh file-f.sh if1.sh if2.sh if3.sh shell20-7.sh

如果01.sh存在,那麽輸出yes

[root@AliKvn shell]# if [ -n 01.sh ]; then echo yes; fi

yes

2 判斷變量用法(需要雙引號標註)

[root@AliKvn ~]# echo $b


[root@AliKvn ~]# if [ -n "$b" ]; then echo $b; else echo "b is not here"; fi

b is not here


命令的執行結果作為判斷條件

1 判斷系統中是否有mysql用戶存在

解決思路:mysql——》/etc/passwd——》grep ——》再執行條件判斷

[root@AliKvn ~]# if grep -wq 'mysql' /etc/passwd; then echo "exist"; fi

exist

如果mysql1用戶不存在,判斷條件

[root@AliKvn ~]# if ! grep -wq 'mysql1' /etc/passwd; then echo "don't exist"; fi

don't exist

如果mysql1用戶不存在,判斷條件

[root@AliKvn ~]# if grep -wq 'mysql1' /etc/passwd; then echo "exist";else echo " don't exist "; fi

don't exist


以上兩種方法的性質是一樣的



同理

if [ ! -e file ]; then 表示文件不存在時會怎麽樣

if (($a<1)); then …等同於 if [ $a -lt 1 ]; then...

[ ] 中不能使用<,>,==,!=,>=,<=這樣的符號(=是賦值,==是等於)



20.8 case判斷

shell中的case判斷

在shell腳本中,除了用if來判斷邏輯外,還有一種常用的方式,case.

case腳本常用於偏寫系統服務的啟動腳本。例如/etc/init.d/network中就用到了case


格式:

case 變量名 in

value1) 值為value1的時候

command 執行什麽

;; ;;表示一個判斷結束,進入到下一個判斷。

value2) 值為value2的時候

command 執行什麽

;;

*) 除此之外

command 又執行什麽

;;

esac case的倒寫,表示到此結束case腳本


在case程序中,可以在條件中使用|,表示或的意思, 比如

2|3)

command

;;


腳本案例

目的,讓用戶輸入數值,然後用腳本判斷數值的範圍。

例如這個數字一個考試分數值,範圍是0-100,然後再在0-100裏面定義分數的級別:不合格,合格,優秀。


1 創建並編輯腳本

[root@AliKvn shell]# cd /root/shell/

[root@AliKvn shell]# vim sh-case-test.sh


#!/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 ]

then

tag=1

elif [ $n -ge 60 ] && [ $n -lt 80 ]

then

tag=2

elif [ $n -ge 80 ] && [ $n -lt 90 ]

then

tag=3

elif [ $n -ge 90 ] && [ $n -le 100 ]

then

tag=4

else

tag=0

fi

case $tag in

1)

echo "no pass"

;;

2)

echo "pass"

;;

3)

echo "good"

;;

4)

echo "very good"

;;

*)

echo "The number range is 0-100."

;;

esac


參數解釋:(解釋比較長)


#!/bin/bash

read -p "Please input a number: " n 讓用戶輸入字符串,其實這算與用戶交互動作。

例如,read -p "xxx" n 顯示的結果就是xxx:

那麽read -p "Please input a number: " n

輸出是Please input a number:

[root@AliKvn ~]# read -p "Please input a number: " n

Please input a number: 100

[root@AliKvn ~]# echo $n

100



if [ -z "$n" ] 如果n值為空,即用戶沒有輸入n值

then

echo "Please input a number." 輸出告知Please input a number.

exit 1 退出,並返回1個數值,這裏的用法跟echo $?的輸出一樣

fi


n1=`echo $n|sed 's/[0-9]//g'` 判斷變量n1輸入的值是否純數字,是純數字的話,sed功能會將其解析置空(這裏的置空僅僅用於命令條件作用,並不是把n值置空),置空的話下面的條件不成立(if,if為一對)

if [ -n "$n1" ] 當n1數值不為空時(註意,這裏不是n值是n1,兩者性質不同),會被當作輸出不合法

then

echo "Please input a number." 繼續輸出Please input a number.

exit 1 如果n1不為空的話,退出這條件,然後繼續判斷其他條件

fi

那就是說,當用戶輸入的字符串(n值)為純數字的話,條件成立(n1置空)。否則,用戶輸入的不是純數字的話,條件不成立,被腳本認為是不合法輸入,會繼續輸出Please input a number.

if [ $n -lt 60 ] && [ $n -ge 0 ] 條件能到這裏,表示n是一個純數字。當0<n<60

then

tag=1 轉到標記1

elif [ $n -ge 60 ] && [ $n -lt 80 ] 當60<n<80

then

tag=2 轉到標記2

elif [ $n -ge 80 ] && [ $n -lt 90 ] 當80<n<90

then 然後

tag=3 轉到標記3

elif [ $n -ge 90 ] && [ $n -le 100 ] 當90<n<=100

then 然後

tag=4 轉到標記4

else 否則

tag=0 轉到標記0

fi

case $tag in

1) 標記1(tag=1)

echo "no pass" 輸出no pass

;;

2) 標記2

echo "pass" 輸出pass

;;

3) 標記3

echo "good" 輸出good

;;

4) 標記4

echo "very good" very good

;;

*) 以上4個標記都不符合的條件,這時候數值是等於0,又可能是大於100

echo "The number range is 0-100." 輸出The number range is 0-100. 提示用戶輸入正確的數值

;;

esac 結束腳本



3 測試腳本

[root@AliKvn shell]# sh sh-case-test.sh

Please input a number: 111

The number range is 0-100.

超過定義的範圍100以外的數值,所以條件不成立,然後輸出了不成立的信息,此處證明腳本的否定輸出是ok的。

3.1 查看執行過程

[root@AliKvn shell]# sh -x sh-case-test.sh

+ read -p 'Please input a number: ' n

Please input a number: 111

+ '[' -z 111 ']'

++ sed 's/[0-9]//g'

++ echo 111

+ n1=

+ '[' -n '' ']'

+ '[' 111 -lt 60 ']'

+ '[' 111 -ge 60 ']'

+ '[' 111 -lt 80 ']'

+ '[' 111 -ge 80 ']'

+ '[' 111 -lt 90 ']'

+ '[' 111 -ge 90 ']'

+ '[' 111 -le 100 ']'

+ tag=0

+ case $tag in

+ echo 'The number range is 0-100.'

The number range is 0-100.

3.2 輸入不合法的數值數值,例如中英文。

[root@AliKvn shell]# sh sh-case-test.sh

Please input a number: ah1

Please input a number.

執行過程

[root@AliKvn shell]# sh -x sh-case-test.sh

+ read -p 'Please input a number: ' n

Please input a number: ah1

+ '[' -z ah1 ']'

++ sed 's/[0-9]//g'

++ echo ah1

+ n1=ah

+ '[' -n ah ']'

+ echo 'Please input a number.'

Please input a number.

+ exit 1


3.3 正確的範圍輸出結果

[root@AliKvn shell]# sh sh-case-test.sh

Please input a number: 60

pass

[root@AliKvn shell]# sh sh-case-test.sh

Please input a number: 88

good

[root@AliKvn shell]# sh sh-case-test.sh

Please input a number: 98

very good

[root@AliKvn shell]# sh sh-case-test.sh

Please input a number: 100

very good

完全符合剛剛定義的參數配置,成功。下面再看看執行腳本過程。

3.4 執行腳本過程

[root@AliKvn shell]# sh -x sh-case-test.sh

+ read -p 'Please input a number: ' n

Please input a number: 60

+ '[' -z 60 ']'

++ sed 's/[0-9]//g'

++ echo 60

+ n1=

+ '[' -n '' ']'

+ '[' 60 -lt 60 ']'

+ '[' 60 -ge 60 ']'

+ '[' 60 -lt 80 ']'

+ tag=2

+ case $tag in

+ echo pass

pass

[root@AliKvn shell]# sh -x sh-case-test.sh

+ read -p 'Please input a number: ' n

Please input a number: 88

+ '[' -z 88 ']'

++ sed 's/[0-9]//g'

++ echo 88

+ n1=

+ '[' -n '' ']'

+ '[' 88 -lt 60 ']'

+ '[' 88 -ge 60 ']'

+ '[' 88 -lt 80 ']'

+ '[' 88 -ge 80 ']'

+ '[' 88 -lt 90 ']'

+ tag=3

+ case $tag in

+ echo good

good

[root@AliKvn shell]# sh -x sh-case-test.sh

+ read -p 'Please input a number: ' n

Please input a number: 98

+ '[' -z 98 ']'

++ sed 's/[0-9]//g'

++ echo 98

+ n1=

+ '[' -n '' ']'

+ '[' 98 -lt 60 ']'

+ '[' 98 -ge 60 ']'

+ '[' 98 -lt 80 ']'

+ '[' 98 -ge 80 ']'

+ '[' 98 -lt 90 ']'

+ '[' 98 -ge 90 ']'

+ '[' 98 -le 100 ']'

+ tag=4

+ case $tag in

+ echo 'very good'

very good

[root@AliKvn shell]# sh -x sh-case-test.sh

+ read -p 'Please input a number: ' n

Please input a number: 100

+ '[' -z 100 ']'

++ sed 's/[0-9]//g'

++ echo 100

+ n1=

+ '[' -n '' ']'

+ '[' 100 -lt 60 ']'

+ '[' 100 -ge 60 ']'

+ '[' 100 -lt 80 ']'

+ '[' 100 -ge 80 ']'

+ '[' 100 -lt 90 ']'

+ '[' 100 -ge 90 ']'

+ '[' 100 -le 100 ']'

+ tag=4

+ case $tag in

+ echo 'very good'

very good


4 done.

20.5-20.9 shel:l腳本中的邏輯判斷,文件目錄屬性判斷,if特殊用法 ,case判斷