shell基礎知識學習四

來源:互聯網
上載者:User
shell中函數類似於java中的方法,指令碼代碼放在函數中,可以任意位置運行減少大量重複代碼。

瞭解掌握shell函數主要從以下幾點:函數的建立、函數調用、變數、傳回值、參數。

1、函數建立以及調用。

基本結構:有兩種方式帶function和不帶function,

function  hello (){}以及hello (){}

舉個例子:

#!/bin/shfunction hello(){ echo "this is a day : `date`"}echo '=======' helloecho '======='#執行結果=======this is a day : Fri Sep 28 11:56:00 CST 2012=======

需要注意的是:1、函數的建立一定在調用之前。2、函數名稱不要重複,否則先定義的會被覆蓋。

2、傳回值

首先說下預設退出狀態,在指令碼中用$?表示。表示:最後一次執行命令的退出狀態,0代表成功,非0代表失敗。

2.1、$?
#!/bin/shfunction hello(){ echo "this is a day : `date`" cd /qwer}echo "state:$?"echo '=======' hello echo "state: $?"echo '======='#執行結果:state:0=======this is a day : Fri Sep 28 12:12:31 CST 2012./fun.sh: line 5: cd: /qwer: No such file or directorystate: 1=======

如上所示:兩個$?分別0和1,對比來看下一個程式:

#!/bin/shfunction hello(){ echo "this is a day : `date`" cd /qwer}echo "state:$?"echo '=======' hello echo "test..test..." echo "state: $?"echo '======='#執行結果:state:0=======this is a day : Fri Sep 28 12:19:28 CST 2012./fun.sh: line 5: cd: /qwer: No such file or directorytest..test...state: 0=======

現在可以深刻理解$?的含義了,shell命令最後一次的執行狀態,當執行完函數後又執行了其他的命令,那麼$?就表示其他命令的執行狀態了。

關於$?還有一個好玩的:

#!/bin/shfunction hello(){ cd /qwer echo "this is a day : `date`"}echo "state:$?"echo '=======' hello echo "state: $?"echo '======='#執行結果:state:0=======./fun.sh: line 4: cd: /qwer: No such file or directorythis is a day : Fri Sep 28 12:26:43 CST 2012state: 0=======

好吧,預設退出狀態不太好用吧。

 

2.2、使用傳回值return

return只能返回單個的整數,對於字串指令碼會報錯。

看下面的程式。使用者輸入值和100比較,返回不同的值。

read -p "please input :" valuetest(){ if [ $value -lt 100 ] then  echo "< 100 "  return -1 elif [ $value -eq 100 ] then  echo "= 100"  return 0 else  echo "> 100"  return 1fi}testecho "result value is :$?"#執行結果:please input :999> 100result value is :1

 

即是return的傳回值由$?接受。
====================================

有一點很疑惑,如果在上述指令碼if語句的結束後,加上return 1000

最後程式的輸出,

please input :999
> 100
result value is :1

為什麼是1?有的時候是255,???

====================================

另外在一種方法就是使用函數的輸出。輸出可以被捕獲放入shell變數中。

ceo () {read -p "please input a value:" valueecho $[ $value * 2 ]}result=`ceo`echo "the result is : $result"#執行結果:please input a value:999the result is : 1998

注意接受的時候是result = `ceo`

====================================

還是上述指令碼,把輸出替換成:
echo $[ $vale ]
echo $[ $value * 2 ]

輸出變成了:the result is : 0

不明白?

====================================

3、參數的傳遞

shell指令碼函數參數的傳遞可以用標準參數環境變數表示。

如下指令碼:根據傳入參數個數不同,做不同輸出

#!/bin/shfunction param(){ if [ $# -lt 2 ] then  echo "param count < 2" elif [ $# -gt 2 ] then  echo "param count > 2 " else  echo "param count =2" fi}param 1 2 3#執行結果:param count > 2 

需要注意的是,函數不能直接使用指令碼的參數,函數為自己的參數使用專用的參數環境變數。

就是說在運行指令碼時候,用命令列傳入的參數函數是無法直接使用的,必須手動傳入才可以。

看下面的例子:

function useMainPram(){  echo "----"  echo $1  echo $2  echo "----"}echo $1echo $2useMainPram#檔案命名為param.sh ./param.sh 98 99執行結果:9899--------

函數中的列印沒有值,調整指令碼中函數調用為:useMainPram $1 $2

同樣的執行命令,結果正確展示。

4、變數

變數主要是範圍的問題,在指令碼內(不是函數內部)定義的變數在任何地方都是可以用的,屬於全域變數。

函數內部可以定義局部變數用local修飾,範圍僅僅在函數內部。

b=100function tt(){ local b=10 result=$[$b + 5 ]}ttecho $resultecho $b#執行結果:15100

5、庫檔案

函數可以在指令碼內部使用,如果多個指令碼要使用同一個函數就要使用到庫檔案。

首先建立庫檔案,檔案名稱ku,注意是沒有尾碼名稱的:

function useMainPram(){  echo "----"  echo $1  echo $2  echo "----"}

然後在指令檔中調用,指令碼命名param.sh:

. ./kuecho $1echo $2useMainPram $1 $2#執行結果 ./param.sh:9899----9899----

需要注意的是:引入庫檔案的格式

點後面有個空格,然後是執行庫檔案。

 

到這裡就差不多了,函數的基本操作就這些了。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.