linux shell程式設計語句if case

2021-06-28 02:53:21 字數 3514 閱讀 6245

shell學習筆記--if,case

shell的控制流結構主要有if語句、for語句、case語句、while語句、until語句這五種,在shell中這些語句的用法有點類似c語言,很容易學會,但也很容易忘記,只有經常實用它們才不會很快忘記,像我之前看的時候很快就看完了,但是很久沒用,過一陣子又把它忘記了,現在又重看了一遍才記起來,好了,下面將詳細介紹這幾種語句的用法:

1、if then else 語句

if then else語句的基本格式如下:

if 條件1

then 命令1

elif 條件2

then 命令2

else 命令3

fi舉個例子:

$cat iftest

#!/bin/sh

#iftest

if [ 「10」 -lt 「12」 ]

then

echo 「yes,10 is less than 12」

fi執行一下iftest

$./iftest

yes,10 is less than 12

這裡的是測試命令,測試裡面的內容是真還是假,如果為真則該測試命令返回的結果是真,如果為假則該測試命令返回的結果為假。這裡要注意的是與中間的內容一定要在兩邊各留乙個空格,否則會出錯。如[「10」 -lt 「12」]這樣是錯誤的寫法,一定要在兩邊各留乙個空格才是測試命令。這裡可以看出,if後面跟著的是一條命令,if這裡明明要跟乙個條件才對啊,為什麼會跟一條命令呢?這是因為在shell中,所有的命令執行後都有乙個返回值,if是接收到該返回值作為它的條件,也就是真還是假這兩種條件,如果該命令執行成功,則if的條件為真,失敗則為假了。像我們平時執行ls、cp、touch、mkdir等等這些命令時系統都會返回乙個值表示執行該命令是否成功,該返回值就儲存在$?這裡了,如果你要看它的值就可以用:echo $?來檢視了。如:

$lsa.txt b.doc

$echo $?

0在linux中一般用0表示執行成功,而非0則表示失敗。如:

if ls

then

echo 「yes」

else

echo 「no」

fi該程式執行後的結果將會列印出yes。這裡ls執行成功後返回的值為0(成功),if接收到成功訊號則其條件為真,所以就列印出yes了。這裡不要跟c的if混淆了,在c中0為假,非0為真,而這裡倒反過來了,0為真,非0則為假了。這個就涉及到linux的習慣了,因為linux習慣用0來表示成功,非0表示失敗。這裡還要小心,不能像這樣用:if (「10」 -lt 「12」)。上面的[ 「10」 -lt 「12」 ]也是乙個命令來的,相當於命令:test 「10」 -lt 「12」。test是乙個測試命令,如果要講測試命令還有很多要講,這裡就直接講控制流結構,至於測試命令有空再寫了。

2、case 語句

case語句的格式如下:

case 值 in

模式1)

命令1...

;;模式2)

命令2...

;;......

esac

上面的;;有點相當於c中case中的break語句的意味了,即執行完該模式後跳出case語句,不過有點不同的就是,shell中的case語句如果沒有;;就會報錯,但是c中的case語句少了break,語法上還是正確的,只是在符合該模式後還會繼續執行直到遇到break或直到結束為止。在shell的case語句中,可以使用匹配模式,就是前面說過的元字元匹配模式,而不是正規表示式的匹配。如:

* 匹配所有的字元

? 匹配單個字元

[...]匹配括起的字元

所以在c中使用default模式的,這裡可以使用*來代替如:

$cat casetest

#!/bin/sh

#casetest

echo "please input number 1 to 3"

read number

case $number in

1)echo "you input 1"

;;2)

echo "you input 2"

;;3)

echo "you input 3"

;;*)

echo "error! the number you input isn't 1 to 3"

;;esac

執行這個shell指令碼,如果你輸入的是1~3外的數字,都將輸出error! the number you input isn't 1 to 3這句。這裡的*就是匹配所有模式。從前面開始執行,如果它不匹配於前面的任何一種模式,則會匹配到這裡的*,結果就自然輸出error! the number you input isn't 1 to 3這句了。case語句中的模式中還可以使用|(或),如:

$cat casetest

#!/bin/sh

#casetest

echo "please input number 1 to 10"

read number

case $number in

1|2|3)

echo "the number you input is 1~3"

;;4|5|6)

echo "the number you input is 4~6"

;;7|8|9|10)

echo "the number you input is 7~10"

;;*)

echo "error! the number you input isn't 1 to 10"

;;esac

這樣無論你輸出的是1,還是2,還是3都會輸出第一句話,無論你輸出的是4,還是5,還是6輸出的都是第二句話,如此類推。最後來乙個經典的例子:

$cat caseparam

#!/bin/sh

#caseparam

if [ $# != 1 ]

then

echo "usage:`basename $0` [start|stop|help]" >&2

exit 1

fiopt=$1

case $opt in

start)

echo "start..`basename $0`"

;;stop)

echo "stop..`basename $0`"

;;help)

echo "now don't support help"

;;*)

echo "usage:`basename $0` [start|stop|help]"

;;esac

執行這個程式如果用./caseparam則輸出:usage:caseparam [start|stop|help] ;如果用./caseparam start 則輸出:start..caseparam;如果用./caseparam stop則輸出:stop..caseparam等等,以此類推。上面的$#是計算引數的個數,所以如果引數個數不等於1的話,該程式則退出。這個程式是不是感覺好熟悉呢?一般在/etc/init.d/下面的程式都是這種start、stop、restart...這種格式的。

好了,控制流結構中的分支語句部分就這兩種了,下篇繼續講控制流結構中的迴圈語句。

Linux Shell程式設計case語句

linux shell程式設計case語句 case語句適用於需要進行多重分支的應用情況。case分支語句的格式如下 case 變數名in 模式1 命令序列1 模式2 命令序列2 預設執行的命令序列 esac case語句結構特點如下 case行尾必須為單詞 in 每乙個模式必須以右括號 結束。雙分...

linux shell程式設計之 if語句

一 語句格式 一行中的寫法 if test commands then consequent commands fi 多行的寫法 if 條件 then command else command fi 基本語法記住亮點 1 按照漢語的方式記憶 如果 if 那麼 then 就 否則 else 就 2 記...

Linux Shell程式設計case語句

case語句適用於需要進行多重分支的應用情況。case分支語句的格式如下 case 變數名in 模式1 命令序列1 模式2 命令序列2 預設執行的命令序列 esac case語句結構特點如下 case行尾必須為單詞 in 每乙個模式必須以右括號 結束。雙分號 表示命令序列結束。匹配模式中可是使用方括...