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

2021-05-24 06:15:25 字數 1353 閱讀 7690

最近開始學習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修改如下:

執行結果如下:

由此可以得出兩個結果:

shell指令碼中,呼叫乙個函式,如果該函式中有echo語句,而且沒有重定向符,那麼該函式的返回值就是由所有echo語句所組成的字串的集合

shell指令碼中,return命令,是把返回值賦值給$?變數,exit命令也一樣(return和exit區別暫時還沒發現,如果有哪位高人知道的話煩請指點一二)

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

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

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

shell指令碼中呼叫其他指令碼

目前來說有三種方法 1.指令碼絕對路徑 這個方式是最普通的,底層呼叫的是fork實現,執行的時候開乙個子shell執行呼叫的指令碼,子shell執行的時候,父shell還在 子shell執行完畢後返回父shell,子shell從父shell繼承環境變數,但是子shell中的環境變數不會帶回父shel...

shell指令碼 之 函式返回值

shell 函式返回值 只允許返回數字,若不是則報 line 6 return haha numeric argument required 若是寫了return 則返回return 語句跟的數值,若是沒有return語句則返回最後乙個命令的執行結果。用例子說話吧 1 bin bash 2 3 re...

shell指令碼中的函式, shell中的陣列

示例1 bin bash 函式的使用 input input 1 a b root second fun.sh 1 a 3 fun.sh 示例2 bin bash 傳遞乙個引數給函式 input read p please input n input root second fun.sh pleas...