天天看點

shell script中的case……esac判斷

利用 case ..... esac 判斷

上個小節提到的『 if .... then .... fi 』對於變量的判斷是以『比對』的方式來分辨的,如果符合狀态就進行某些行為,并且透過較多層次 (就是 elif ...) 的方式來進行多個變量的程式碼撰寫,譬如 sh09.sh 那個小程式,就是用這樣的方式來撰寫的羅。好,那麼萬一我有多個既定的變量内容,例如 sh09.sh 當中,我所需要的變量就是 "hello" 及空字串兩個,那麼我隻要針對這兩個變量來配置狀況就好了,對吧?那麼可以使用什麼方式來設計呢?呵呵~就用 case ... in .... esac 吧~,他的文法如下:

要注意的是,這個文法以 case (實際案例之意) 為開頭,結尾自然就是将 case 的英文反過來寫!就成為 esac 羅!不會很難背啦!另外,每一個變量内容的程式段最後都需要兩個分号 (;;) 來代表該程式段落的結束,這挺重要的喔!至於為何需要有 * 這個變量内容在最後呢?這是因為,如果使用者不是輸入變量内容一或二時,我們可以告知使用者相關的資訊啊!廢話少說,我們拿 sh09.sh 的案例來修改一下,他應該會變成這樣喔:

在上面這個 sh09-2.sh 的案例當中,如果你輸入『 sh sh09-2.sh test 』來運作,那麼螢幕上就會出現『Usage sh09-2.sh {hello}』的字樣,告知運作者僅能夠使用 hello 喔~這樣的方式對於需要某些固定字串來運作的變量内容就顯的更加的友善呢!這種方式你真的要熟悉喔!這是因為系統的很多服務的啟動 scripts 都是使用這種寫法的,舉例來說,我們 Linux 的服務啟動放置目錄是在 /etc/init.d/ 當中,我已經知道裡頭有個syslog 的服務,我想要重新啟動這個服務,可以這樣做:

/etc/init.d/syslog restart

重點是那個 restart 啦!如果你使用『 less /etc/init.d/syslog 』去查閱一下,就會看到他使用的是 case 文法,并且會規定某些既定的變量内容,你可以直接下達 /etc/init.d/syslog ,該 script 就會告知你有哪些後續接的變量可以使用羅~友善吧! ^_^

一般來說,使用『 case $變量 in 』這個文法中,當中的那個『 $變量 』大緻有兩種取得的方式:

直接下達式:例如上面提到的,利用『 script.sh variable 』的方式來直接給予 $1 這個變量的内容,這也是在 /etc/init.d 目錄下大多數程式的設計方式。

互動式:透過 read 這個指令來讓使用者輸入變量的内容。

這麼說或許你的感受性還不高,好,我們直接寫個程式來玩玩:讓使用者能夠輸入 one, two, three ,并且将使用者的變量顯示到螢幕上,如果不是 one, two, three 時,就告知使用者僅有這三種選擇。

此時,你可以使用『 sh sh12.sh two 』的方式來下達指令,就可以收到相對應的回應了。上面使用的是直接下達的方式,而如果使用的是互動式時,那麼将上面第 10, 11 行的 "#" 拿掉,并将 12 行加上注解 (#),就可以讓使用者輸入參數羅~這樣是否很有趣啊?

繼續閱讀