[Shell] if、for、while流程語句以及整數字符串判斷比較的例項詳解

dbasdk發表於2014-09-10

前言:

實際上Shell是一個命令直譯器,它解釋由使用者輸入的命令並且把它們送到核心。不僅如此,Shell有自己的程式語言用於對命令的編輯,它允許使用者編寫由shell命令組成的程式。Shell程式語言具有普通程式語言的很多特點,比如它也有迴圈結構和分支控制結構等,用這種程式語言編寫的Shell程式與其他應用程式具有同樣的效果。


一,shell的流程語句

1,條件語句if else if

示例程式碼:

[root@squid-2 script]# cat s1.sh

#!/bin/bash

echo "Please choose project:"

echo "1:zhu  2:sha"

read project_no

if [ $project_no = "1" ];then

       echo "111111"

elif [ $project_no = "2" ];then

       echo "222222"

else echo "error"

fi

[root@squid-2 script]#

 

執行過程如下:

[root@squid-2 script]# sh s1.sh

Please choose project:

1:zhu 2:sha

1

111111

[root@squid-2 script]# sh s1.sh

Please choose project:

1:zhu 2:sha

2

222222

[root@squid-2 script]# sh s1.sh

Please choose project:

1:zhu 2:sha

3

error

[root@squid-2 script]#

 

 

2,for 迴圈

2.1 for i in 

指令碼如下:

[root@squid-2 script]# cat host_list.txt

192.168.1.10

192.168.1.11

192.168.1.12

192.168.1.13

[root@squid-2 script]#


測試執行結果:

[root@squid-2 script]# sh s21.sh

the host ip address is: 192.168.1.10

the host ip address is: 192.168.1.11

the host ip address is: 192.168.1.12

the host ip address is: 192.168.1.13

[root@squid-2 script]#

 

2.2 for((賦值;條件;運算語句))

指令碼程式碼:

[root@squid-2 script]# cat s22.sh

for((i=1;i<=10;i++));do

   echo "the loop number i: $i";

done;

[root@squid-2 script]#


執行結果:

[root@squid-2 script]# sh s22.sh

the loop number i: 1

the loop number i: 2

the loop number i: 3

the loop number i: 4

the loop number i: 5

the loop number i: 6

the loop number i: 7

the loop number i: 8

the loop number i: 9

the loop number i: 10

[root@squid-2 script]#

 

3,while迴圈使用

條件語句結構:

while

do

action

done;


測試指令碼:

[root@squid-2 script]# cat s3.sh

#!/bin/sh

i=10;

while [[ $i -gt 5 ]];do

    echo"the loop number of while case is: $i";

   ((i--));

done;

[root@squid-2 script]


執行結果:

[root@squid-2 script]# sh s3.sh

the loop number of while case is: 10

the loop number of while case is: 9

the loop number of while case is: 8

the loop number of while case is: 7

the loop number of while case is: 6

[root@squid-2 script]#

 

4,until迴圈語句

示例指令碼:

[root@squid-2 script]# cat s4.sh

#!/bin/sh

a=1;

until [[ $a -gt 6 ]];do

         echo"the until number is: $a";

         ((a++));

done;

[root@squid-2 script]#

 

執行結果:

[root@squid-2 script]# sh s4.sh

the until number is: 1

the until number is: 2

the until number is: 3

the until number is: 4

the until number is: 5

the until number is: 6

[root@squid-2 script]#

 

5,shell選擇語句

5.1,使用case選擇語句使用(case/esac)

語法結構:

case $arg in 

   pattern | sample) # arg in pattern or sample 

   ;; 

   pattern1) # arg in pattern1 

   ;; 

   *) #default 

   ;; 

esac

 

說明:pattern1 是正規表示式,可以用下面字元:

 

                 *       任意字串

                 ?       任意字元

                 [abc]  a, b, 或c三字元其中之一

                 [a-n]   從a到n的任一字元

                 |       多重選擇

 

程式碼指令碼:

[root@squid-2 script]# cat s51.sh

#!/bin/sh

 

case $1 in

start | begin)

   echo "start something" 

   ;;

stop | end)

   echo "stop something" 

   ;;

*)

   echo "Ignorant" 

   ;;

esac

[root@squid-2 script]#


PS:執行結果,這裡需要帶入引數,引數值就在)前面的start、begin、stop、end之內,如果帶入別引數,則返回"Ignorant":

[root@squid-2 script]# sh s51.sh start

start something

[root@squid-2 script]# sh s51.sh begin

start something

[root@squid-2 script]# sh s51.sh end

stop something

[root@squid-2 script]# sh s51.sh stop

stop something

[root@squid-2 script]# sh s51.sh test1

Ignorant


5.2,select語句使用方法(產生選單選擇)

語法結構:

select 變數name  in seq變數

do

   action

done


程式碼如下:

cat s52.sh

#!/bin/sh

select param in "begin""end" "exit"

do

case $param in

"begin")

   echo "start something" 

   ;;

"end")

   echo "stop something" 

   ;;

"exit")

   echo "exit" 

   break;

   ;;

*)

   echo "Ignorant" 

   ;;

esac

done;


執行結果:

[root@squid-2 script]# sh s52.sh begin

1) begin

2) end

3) exit

#? 1

start something

#? 2

stop something

#? 3

exit

[root@squid-2 script]#

PS:執行的時候,只有輸入exit,才能退出來執行小視窗。

說明:select是迴圈選擇,一般與case語句使用。


二,shell語句的比較運算子

1,整數比較

規則說明:

-eq      等於                  if [ "$a" -eq "$b" ]

-ne      不等於                if [ "$a" -ne "$b" ]

-gt      大於                  if [ "$a" -gt "$b" ]

-ge      大於等於              if [ "$a" -ge "$b" ]

-lt      小於                    if [ "$a" -lt "$b" ]

-le      小於等於               if [ "$a" -le "$b" ]

<=       小於等於(...)                (("$a" <= "$b" ))

>        大於(...)                    (("$a" > "$b" ))

>=       大於等於(...)                (("$a" >= "$b" ))

PS:小資料比較可使用AWK

 

示例程式碼:

[root@squid-2 script]# cat com1.sh

a=$1

b=$2

if [ "$a" -eq "$b" ];then

         echo"a = b true."

elif [ ! "$a" -gt "$b" ];then

         echo"a > b true."

else echo "a < b true."

fi

[root@squid-2 script]#


測試結果如下:

[root@squid-2 script]# sh com1.sh 1 1

a = b true.

[root@squid-2 script]# sh com1.sh 1 2

a > b true.

[root@squid-2 script]# sh com1.sh 1 0

a < b true.

[root@squid-2 script]#


2,字串比較

2.1,規範以及使用

規則說明:

=     等於           if [ "$a"= "$b" ]

==    與=等價

!=    不等於         if [ "$a" ="$b" ]

      if [[ "$a" < "$b" ]]

      if [ "$a" \< "$b" ]         #需要對

>     大於

-z    字串為null,即長度為0

-n    字串不為null,即長度不為0

 

示例程式碼:

[root@squid-2 script]# cat com2.sh

a=$1

b=$2


# 1 the first method to implement

if [ "$a"x = "$b"x ];then

         echo"a = b"

elif [ ! "$a"x  = "$b"x ]; then

         echo"a != b"

else echo "others"

fi

 

# 2 the second method to implement

if [ "$a"x == "$b"x ];then

       echo "a = b"

elif [ "$a"x  != "$b"x ]; then

       echo "a != b"

else echo "others"

fi

 

測試執行結果:

[root@squid-2 script]# sh com2.sh ccb aaa

a != b

a != b

[root@squid-2 script]# sh com2.sh ccb ccb

a = b

a = b

[root@squid-2 script]#

[root@squid-2 script]#


2.2,需要注意的地方

比較兩個字串是否相等的辦法是:
if [ "$a"x = "b"x ];then
這裡的關鍵有幾點:
1 使用單個等號
2 注意到等號兩邊各有一個空格:這是unix shell的要求
3 注意到"$a"x最後的x,這是特意安排的,因為當$test為空的時候,上面的表示式就變成了x = bx,顯然是不相等的。而如果沒有這個x,表示式就會報錯:[: =: unary operator expected



[[ $a == z* ]]   # 如果$a以"z"開頭(模式匹配)那麼將為true

[[ $a == "z*" ]] # 如果$a等於z*(字元匹配),那麼結果為true

 [ $a == z* ]     # File globbing 和word splitting將會發生

 [ "$a" == "z*" ] # 如果$a等於z*(字元匹配),那麼結果為true

 

關於File globbing:

一點解釋,關於Fileglobbing是一種關於檔案的速記法,比如"*.c"就是,再如~也是. 
但是file globbing並不是嚴格的正規表示式,雖然絕大多數情況下結構比較像. 

 

特殊字元的比較:
!= 不等於,如:if [ "$a" != "$b" ] 
這個運算子將在[[]]結構中使用模式匹配. 
< 小於,在ASCII字母順序下.如: 
if [[ "$a" < "$b" ]] 
if [ "$a" \< "$b" ] 
注意:在[]結構中"
> 大於,在ASCII字母順序下.如: 
if [[ "$a" > "$b" ]] 
if [ "$a" \> "$b" ] 
注意:在[]結構中">"需要被轉義. 

-z 字串為"null".就是長度為0. 
-n 字串不為"null" 
注意: 
使用-n在[]結構中測試必須要用""把變數引起來.使用一個未被""的字串來使用! -z 
或者就是未用""引用的字串本身,放到[]結構中。雖然一般情況下可 以工作,但這是不安全的.習慣於使用""來測試字串是一種好習慣。


2.3,判斷字串是否空

示例程式碼:

[root@squid-2 script]# cat com3.sh

#!/bin/bash

a=$1

if [ -z "$a" ]; then

         echo"a is empty."

else echo "a is a object."

fi

[root@squid-2 script]


測試執行結果:

[root@squid-2 script]# sh com3.sh a

a is a object.

[root@squid-2 script]# sh com3.sh

a is empty.

[root@squid-2 script]#

 

3,檔案判斷

規則說明:

-e                         檔案存在
-a                         檔案存在(已被棄用)
-f                         被測檔案是一個regular檔案(正常檔案,非目錄或裝置)
-s                         檔案長度不為0
-d                         被測物件是目錄
-b                         被測物件是塊裝置
-c                         被測物件是字元裝置
-p                         被測物件是管道
-h                         被測檔案是符號連線
-L                         被測檔案是符號連線
-S(大寫)                   被測檔案是一個socket
-t                         關聯到一個終端裝置的檔案描述符。用來檢測指令碼的stdin[-t0]或[-t1]是一個終端
-r                         檔案具有讀許可權,針對執行指令碼的使用者
-w                         檔案具有寫許可權,針對執行指令碼的使用者
-x                         檔案具有執行許可權,針對執行指令碼的使用者
-u                         set-user-id(suid)標誌到檔案,即普通使用者可以使用的root許可權檔案,透過chmod +s file實現
-k                         設定貼上位
-O                         執行指令碼的使用者是檔案的所有者
-G                         檔案的group-id和執行指令碼的使用者相同
-N                         從檔案最後被閱讀到現在,是否被修改

f1-nt f2                   檔案f1是否比f2新
f1 -ot f2                   檔案f1是否比f2舊
f1 -ef f2                   檔案f1和f2是否硬連線到同一個檔案

 

示例指令碼程式碼:

[root@squid-2 script]# cat com4.sh

#!/bin/bash

a=$1

file=$2

if [ -d $a ]; then

         echo"it is a directory."

elif [ -f "$a" ]; then

         echo"it is a file."

else echo "no parameter."

fi

 

測試執行結果如下:

[root@squid-2 script]# sh com4.sh log1

it is a file.

[root@squid-2 script]# sh com4.sh old

it is a directory.

[root@squid-2 script]#

 

參考資料:

http://www.cnblogs.com/chengmo/archive/2010/10/14/1851434.html

http://blog.csdn.net/yf210yf/article/category/1475895

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29734436/viewspace-1266903/,如需轉載,請註明出處,否則將追究法律責任。

相關文章