1. 程式人生 > >shell指令碼中函式呼叫的返回值,以及退出狀態問題

shell指令碼中函式呼叫的返回值,以及退出狀態問題

     最近開始學習shell指令碼,由於之前沒怎麼接觸過linux和shell,所以一切從頭開始學起

     shell指令碼編寫方法與程式設計類似,只是趨向於面向物件程式設計(個人理解,如果錯誤,麻煩各位老鳥指出)。其他關於shell指令碼到底是怎麼樣的一個東西大家可以上網查詢一下資料。

     由於之前寫程式碼,使用的都是C,C++,C#之類的編譯型(compiled)語言,所以在接觸與學習shell指令碼這類指令碼(scripting)程式語言的時候,總會不由自主的聯想到C,C++,通過類比的方法來學習shell指令碼。

     最近在一次寫shell指令碼的時候,遇到一個有趣的事,然後就做了一些小實驗,是關於shell指令碼中函式呼叫的返回值,退出狀態的問題。

     只要寫過程式碼,用過C,C++的人都知道,多數函式都會有一個返回值,用來指出該函式被執行後的結果是什麼。

     那麼shell指令碼中,呼叫一個函式,也能有一個返回值的吧?

     然後我就做了如下實驗:

     建立一個檔案ccc,內容如下:

    

    該指令碼中包含一個函式Func,功能是在在螢幕上輸出字串abc,然後返回1給變數res,並在螢幕上顯示res的值

    執行該指令碼後,發現,螢幕上只有輸出是字串abc。

    奇怪?!那用來接收返回值的變數res去哪裡了?如果是空的話,至少也會輸出一行字串abc加一個空行,這樣一共有2行。但事實是螢幕上只有輸出一行。

    接下來,我把指令碼ccc中的內容修改了一下:

     $?表示的是上一條語句執行後的退出狀態,如果是正常退出,則預設值應該為0

     但執行指令碼後的結果如下:

     事實上$?的值為1,而且,字串abc在1後面被輸出,這說明什麼?說明呼叫函式Func的時候根本沒有輸出abc,螢幕上顯示的abc,其實是res的值,即函式Func的返回值!為了驗證一下,再次把指令碼ccc修改如下:

    執行結果如下:

    由此可以得出兩個結果:

  1. shell指令碼中,呼叫一個函式,如果該函式中有echo語句,而且沒有重定向符,那麼該函式的返回值就是由所有echo語句所組成的字串的集合
  2. shell指令碼中,return命令,是把返回值賦值給$?變數,exit命令也一樣(return和exit區別暫時還沒發現,如果有哪位高人知道的話煩請指點一二)

     那如果被呼叫函式中有重定向符呢?如果把被呼叫函式中的所有echo語句,都重定向到一個檔案result.txt中,執行指令碼後,結果如下:

     用於接收函式Func執行結果的變數res為空值。但是退出狀態仍然為return命令後面的數值

     弄清楚了shell指令碼中返回值,退出狀態的問題後,那隨之而來就產生了一個新的問題:我的初衷是在被呼叫函式中輸出字串,但現在無法做到在被呼叫函式中輸出,因為所有的echo都打到的函式返回值中去了(或者如果有重定向符,輸出到了指定地方去了),那如何在被呼叫函式中做到在螢幕上輸出呢?

      這個問題我還沒想到辦法。如果有誰知道答案的,歡迎留言告訴我一下,或者大家可以一起討論嘗試一下