1.利用 case ..... esac 判斷
1.1 認識case ..... esac
上一篇文章提到的if ... then ... fi
對于變量的判斷是以 “比對” 的方式來分辨的,如果符合狀態,就進行某些行為,并且透過較多層次(就是elif...)的方式來進行多個變量的程序代碼撰寫。case ..... esac
也是條件判斷式,它擁有和if ... then ... fi
同樣的功能,只是代碼形式上不太相同。
case ..... esac
的語法結構:
把上一篇Linux 之 shell script -- 條件判斷式(if ... then)中的
hello-2.sh
用case .. in .. esac
的語法改寫一下
vi hello-3.sh
輸入如下內容:
#!/bin/bash
case ${1} in
"hello")
echo "Hello,how are you ?"
;;
"")
echo "You must input parameters, ex> {${0} someword}"
;;
*) #其實就相當于通配符,0-無窮多個任意字符之意!
echo "Usage ${0} {hello}"
;;
esac
1.2 ${變量} 獲取方式
使用 「case $變量 in」這個語法中,當中的 「$變量」大致有兩種取得的方式
- 1)直接下達式
利用「script.sh variable」的方式來直接給予$1
這個變量的內容,這也是在/etc/init.d目錄下大多數程序的設計方式 - 2)交互式
透過 read 這個指令來讓用戶輸入變量的內容,例如前面幾篇學習中我們一直用到的read -p
~~舉一個例子來深入理解 $1的下達方式~~
讓使用者能夠輸入one,two,three并且將用戶的變量顯示到屏幕上,如果不是one,two,three時,就告知使用者僅有這三種選擇。
vi show123.sh
寫入如下代碼
#!/bin/bash
echo "This program will print your selection !"
# read -p "Input your choice:" choice #暫時取消,可以替換
# case ${choice} in #暫時取消,可以替換
case ${1} in
"one")
echo "Your choice is ONE"
;;
"two")
echo "Your choice is TWO"
;;
"three")
echo "Your choice is THREE"
;;
*)
echo "Usage ${0} {one|two|three}"
esac
以上這段代碼是 直接下達式 獲取 $變量,如果改成 交互式:
可以將3,4行的#
拿掉,同時給第5行加上#
2. 利用 function 功能
2.1 認識 function
函數可以在shell script 當中作出一個類似自定義執行指令的東西,最大的功能是,可以簡化我們很多的程序代碼。
-
函數 的語法是這樣的
function的語法
其中fname是我們定義的函數名,而function的設定一定要在程序的最前面。
2.2 function 實踐
2.2.1 function初顯威力
在這里,我們改寫??用到過的show123.sh
(自定義一個名為printit的函數)
vi show123-2.sh
寫入如下代碼
- 第2-4行為 printit 函數定義
- 第5行為程序介紹
- 第6行到最后就是
case ... esac
形式的多級判斷
#!/bin/bash
function printit(){
echo -n "Your choice is" #加上 -n可以不斷行繼續在同一行顯示
}
echo "This program will print your selection !"
case ${1} in
"one")
printit; echo ${1} | tr 'a-z' 'A-Z' #這里用 tr 將參數做大小寫轉換
;;
"two")
printit; echo ${1} | tr 'a-z' 'A-Z' #這里";"號的存在,是為了實現命令的連續下達
;;
"three")
printit; echo ${1} | tr 'a-z' 'A-Z'
;;
*)
echo "Usage ${0} {one|two|three}"
;;
esac
可以看得出來,這個show123-2.sh
可是一個直接下達式獲取變量的shell,因此運行時不要忘記在命令行執行shell時,在其后為$1
賦值。
2.2.2 function 威力升級
如果某些程序代碼一再地在script當中重復,這個function不但可以簡化程序代碼,而且可以做成類似“模塊”的東西。show123-2.sh
還是沒有竭盡全力得發揮函數的功能,下面對show123.sh
再做一次 升級~
function的內建變量:
看function威力升級之前先了解這個:function也是擁有內建變量的,他的內建變量與shell script很類似,函數名稱代表$0
,而后續接的變量也是以$1
,$2
來取代的
vi show123-3.sh
寫入如下代碼:
#!/bin/bash
function printit(){
echo "Your choice is ${1}" #注意哦,這里的${1}指的是函數printit的內建變量$1
}
case ${1} in
"one")
printit 1 #請注意,printit指令后面還有接參數
;;
"two")
printit 2
;;
"three")
printit 3
;;
*)
echo "Usage ${0} {one|two|three}"
;;
esac
寫好后運行一下,我們會驚奇得發現
執行sh show123-3.sh one
的結果竟然是 Your choice is 1
如果理解了函數的內建變量,就明白輸出結果不是Your choice is one
的原因
因為 printit 的定義程序 echo "Your choice is ${1}"
翻譯成人話就是 -- 打印 “Your choice is 'printit 的內建變量 $1‘”
第七行的1
,第十行的2
,第十三行的3
都作為 printit的內建變量 $1
被輸出。
理解起來可能有些繞彎彎。。。