[Shell] if、for、while流程語句以及整數字串判斷比較的執行個體詳解,shellwhile

來源:互聯網
上載者:User

[Shell] if、for、while流程語句以及整數字串判斷比較的執行個體詳解,shellwhile

前言:

實際上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 是Regex,可以用下面字元:

 

                 *       任意字串

                 ?       任意字元

                 [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" ))

>=       大於等於(...)                (("$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" ]

<     小於,在ASCII字母中的順序:

      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並不是嚴格的Regex,雖然絕大多數情況下結構比較像. 

 

特殊字元的比較:
!= 不等於,如: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

 


bash shell中迴圈與判斷語句的格式

1) [[]] 和[] 基本一樣但是[[]]在某些情況容錯能力強;(())是直接算數運算的意思如((i++));
2,[] 表示test,你 man test就知道啦,程式規定,算數比較用 lt gl eq,字元比較 > ,<..
3,不一定,變數中有空格是必需加上,例如name abc你不用引號就成了$name abc和“$name abc" 不一樣
 
linux shell編程 if語句不可以判斷變數是否相等

(($num1 != $num2))裡面的是算術運算式
用(($num1 - $num2))
或者[ [ $num1 != $num2 ]]
 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.