Linux Shell編程學習筆記(二)函數

此次咱們回顧一下函數的定義,在此以前,如咱們學習結構化編程同樣,任何語言都脫離不了某種範式,咱們先從這些範式入手。首先是條件判斷。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函數,當 然咱們這麼說並不許確,我只是想說明程序的入口本質上也是函數,因此若是說$?是函數的返回值的話天然也是程序的返回值。

相關文章
相關標籤/搜索