此次咱們回顧一下函數的定義,在此以前,如咱們學習結構化編程同樣,任何語言都脫離不了某種範式,咱們先從這些範式入手。首先是條件判斷。shell
具體的結構是:編程
if condition;函數
then command;學習
elif condition;測試
then commands;.net
else設計
command;繼承
fi進程
condition的編寫能夠經過test命令或者是[]算子。好比test $m -eq 0 或者是[ $m -eq 0 ]get
接着是迭代:迭代的集合類數據以逗號或者是空格分割
data="data1 data2"
迭代的for語句是
for item in $data
do
statements;
done;
在data中默認的分隔符號受IFS變量控制控制例如,你若是要指定:爲你的分割符的話只須要定義變量IFS=「:」,這個很是有用,好比我如今要實現一個功能,要打印全部的用戶所用shell,配置文件在/etc/passwd,能夠執行下面的腳本:
1 echo "-----------------"
2 for line in `cat /etc/passwd`
3 do
4 #echo line=$line
5 count=0;
6 IFS=":"
7 for item in $line
8 do
9 if [ $count -eq 6 ];
10 then echo $item
11 fi
12 let count+=1;
13 done
14 done
固然實現方法多種多樣,你能夠有不少方案選擇。
下面輪到很是重要的知識點:函數。
shell在函數定義的時候使用function來定義,而調用函數的時候直接使用函數名
咱們來看一下:
funtion testfun(){} 或者是 testfun(){}
這個是函數的定義,而在調用函數的時候咱們直接使用testfun就能夠了,不須要加上括號。其實我很喜歡這種設計,對於函數來講無非就是要參數和函數名,我爲什麼要畫蛇添足寫括號浪費我時間呢~
函數有三個東西是很是關鍵的,名字,參數,還有返回值,這些東西決定了一個函數的函數簽名
一般狀況下函數的返回值爲0,屬於正常值.而函數的參數,能夠經過函數的$0123來獲取
那麼我是否能夠指定參數名呢?~實際上是不行的~至少我如今測試出來是不行的.當你須要打印全部的參數的時候能夠選擇$*或者$@.
咱們說咱們採用定義變量的方式是沒法被子進程所繼承的,因此咱們採用了export的方式來傳遞環境變量,那麼函數是否能夠呢?固然也是能夠的咱們在函數名前面加入export參數.我嘗試了一下export testfun
結果發現子進程中根本沒有這個方法。這是由於它會採用變量的方式來傳遞這種東西,所以~當你要傳遞一個方法的時候,要在export後面加上參數-f表明這是一個function.
咱們說函數有三要素,函數名,參數,和返回值。咱們要怎麼得到返回值呢?shell裏面定義了一個$?來存儲返回值,它的功能很像寄存器AX。咱們 能夠經過返回值來肯定程序執行的方向。那麼$?究竟是函數的返回值仍是程序的返回值呢?其實這兩個並不矛盾,咱們知道程序自己的入口也是main函數,當 然咱們這麼說並不許確,我只是想說明程序的入口本質上也是函數,因此若是說$?是函數的返回值的話天然也是程序的返回值。