shell學習筆記--if,caselinux
shell的控制流結構主要有if語句、for語句、case語句、while語句、until語句這五種,在shell中這些語句的用法有點相似C語言,很容易學會,但也很容易忘記,只有常常實用它們纔不會很快忘記,像我以前看的時候很快就看完了,可是好久沒用,過一陣子又把它忘記了,如今又重看了一遍才記起來,好了,下面將詳細介紹這幾種語句的用法:正則表達式
一、if then else 語句shell
if then else語句的基本格式以下:less
if 條件1ide
then 命令1學習
elif 條件2測試
then 命令2spa
else 命令3rest
fiorm
if語句以if開頭,而以fi結束,在shell中的控制流結構的分支語句都是像這樣開頭跟結束的語句相反反過來,以下面的case語句,以case開頭,以esac結束。elif即C語言的else if的意思。若是你只有一個條件,就不必用到elif、else了,這些都是你根據須要去使用的。固然了,若是你有不少個條件,你也能夠使用多個elif,就像C語言同樣。
舉個例子:
$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 $?來查看了。如:
$ls
a.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是一個測試命令,若是要講測試命令還有不少要講,這裏就直接講控制流結構,至於測試命令有空再寫了。
二、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
fi
OPT=$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...這種格式的。
好了,控制流結構中的分支語句部分就這兩種了,下篇繼續講控制流結構中的循環語句。