1. 程式人生 > >Shell函式返回值

Shell函式返回值

shell函式返回值一般有3種方式:

return語句

shell函式的返回值可以和其他語言的返回值一樣,通過return語句返回。

比如:

#!/bin/bash -

function mytest()

{

echo "mytest function"

echo "argv[1] = $1"

if [ $1 = "1" ] ;then

return 1

else

return 0

fi

}

echo "mytest 1"

mytest 1

echo $?

echo "mytest 0"

mytest 0

echo $?

if mytest 1 ; then

echo "mytest 1"

fi

if mytest 0 ;then

echo "mytest 0"

fi

echo "end"

先定義了一個函式,mytest,它根據輸入的引數是否為1來return 1或者return 0.

獲取函式的返回值通過呼叫函式,或者最後執行的值獲得。

另外,可以直接用函式的返回值用作if的判斷。

注意:return只能用來返回整數值,且和c的區別是返回為正確,其他的值為錯誤。


全域性變數或者環境變數

這種就類似於c中的全域性變數。
#!/bin/bash -

g_var=

function mytest2()

{

echo "mytest2"

echo "args $1"

g_var=$1

return 0

}

mytest2 1

echo "g_var=$g_var"

函式mytest2通過修改全域性變數的值來返回結果。

以上兩個方法失效的時候

以上介紹的這兩種方法在一般情況下都是好使的,但也有例外。

比如:

#!/bin/bash -

function mytest3()

{

grep "123" test.txt | awk -F: '{print $2}' | while read line ;do

echo "$line"

if [ $line = "yxb" ]

then

return 0

fi

done

echo "mytest3 here "

return 1

}

g_var=

function mytest4()

{

grep "123" test.txt | awk -F: '{print $2}' | while read line ;do

echo "$line"

if [ $line = "yxb" ]

then

g_var=0

echo "g_var=0"

return 0

fi

done

echo "mytest4 here "

return 1

}

mytest3

echo $?

mytest4

echo "g_var=$g_var"

test.txt中的內容如下:

456:kkk

123:yxb

123:test

輸出如下:

[email protected]
:~/文件/個人文件/shell函式返回值$ ./no_function.sh yxb mytest3 here 1 yxb g_var=0 mytest4 here g_var=

可以看到mytest3在return了以後其實沒有直接返回,而是執行了迴圈體後的語句,同時看到mytest4中也是一樣,同時,在mytest4中,對全域性變數的修改也無濟於事,全域性變數的值根本就沒有改變。

這個是什麼原因那?

筆者認為,之所以return語句沒有直接返回,是因為return語句是在管道中執行的,管道其實是另一個子程序,而return只是從子程序中返回而已,只是while語句結束了。而函式體之後的語句會繼續執行。

同理,全域性變數在子程序中進行了修改,但是子程序的修改沒有辦法反應到父程序中,全域性變數只是作為一個環境變數傳入子程序,子程序修改自己的環境變數,不會影響到父程序。

因此在寫shell函式的時候,用到管道的時候一定要清除,此刻是從什麼地方返回。

Echo返回值


其實在shell中,函式的返回值有一個非常安全的返回方式,即通過輸出到標準輸出返回。因為子程序會繼承父程序的標準輸出,因此,子程序的輸出也就直接反應到父程序。因此不存在上面提到的由於管道導致返回值失效的情況。

在外邊只需要獲取函式的返回值即可。
#!/bin/bash -

function mytest5()

{

grep "123" test.txt | awk -F: '{print $2}' | while read line ;do

if [ $line = "yxb" ]

then

echo "0"

return 0

fi

done

return 1

}

result=$(mytest5)

if [ -z $result ]

then

echo "no yxb. result is empyt"

else

echo "have yxb, result is $result"

fi

輸出如下:

have yxb, result is 0

這個方式雖然好使,但是有一點一定要注意,不能向標準輸出一些不是結果的東西,比如除錯資訊,這些資訊可以重定向到一個檔案中解決,特別要注意的是,用到比如grep這樣的命令的時候,一定要記得1>/dev/null 2>&1來避免這些命令的輸出。

原文地址:http://my.oschina.net/biner/blog/28354

相關推薦

Linux Shell函式返回

                Shell函式返回值,一般有3種方式:return,argv,echo1) return 語句shell函式的返回值,可以和其他語言的返回值一樣,通過return語句返回。示例:#!/bin/bash -function mytest(){    echo "arg1 = $1

shell 函式返回接收問題

shell中函式的呼叫方式有兩種,如下圖: 第一種方式,有點像C語言呼叫函式的風格,直接把函式的執行結果複製給變數!不過,這個賦值過程和C語言的函式賦值是不一樣的!shell中函式呼叫的第一種方式,是將標準輸出傳遞給主程式的變數,而不是返回值! 所以請看以下程式: #!

Shell函式返回

shell函式返回值一般有3種方式:return語句 shell函式的返回值可以和其他語言的返回值一樣,通過return語句返回。比如: #!/bin/bash - function mytest() { echo "mytest function" echo "a

shell 函式返回

Shell函式返回值,常用的兩種方式:return,echo。 1、return 語句 該返回方法有數值的大小限制,超過255,就會從0開始計算,所以如果返回超過255,就不能用這種方式,建議採用ec

Linux Shell函式返回 .

Shell函式返回值,一般有3種方式:return,argv,echo 1) return 語句 shell函式的返回值,可以和其他語言的返回值一樣,通過return語句返回。示例: [javascript] view plaincopyprint? #!/b

shell函式返回的接收

shell中函式返回值接收主要有兩種方法。 方法一: 函式子程式的標準輸出賦值給主程式的變數。 ret=`function_name arg1 arg2 ...` 注意:不是引號。 例

Linux Shell指令碼程式設計--函式返回

Shell函式返回值,常用的兩種方式:return,echo 1) return 語句shell函式的返回值,可以和其他語言的返回值一樣,通過return語句返回。示例: #!/bin/sh function test() { echo "arg1 =

Linux system函式返回(linux C++呼叫shell詳解)

階段2:呼叫/bin/sh拉起shell指令碼,如果拉起失敗或者shell未正常執行結束(參見備註1),原因值被寫入到status的低8~15位元位中。system的man中只說明瞭會寫了127這個值,但實測發現還會寫126等值。

shell】獲取函式返回的兩種方法

方法一: 使用全域性變數 g_result="" function testFunc() { g_result='local value' } testFunc echo $g_resu

Python小白學習之路(十)—【函式】【函式返回】【函式引數】

寫在前面: 昨天早睡之後,感覺今天已經恢復了百分之八十的樣子 又是活力滿滿的小夥郭 今日份雞湯: 我始終相信,在這個世界上,一定有另一個自己,在做著我不敢做的事,在過著我想過的生活。-------宮崎駿 函式 一、函數出現的背景 在學習函式之前,一直遵循:面向過程程式設計,即:根據業務邏輯從上到

recv函式返回總結

函式原型:int recv( SOCKET s, char *buf, int  len, int flags) 功能:不論是客戶還是伺服器應用程式都用recv函式從TCP連線的另一端接收資料。 引數一:指定接收端套接字描述符; 引數二:指明一個緩衝區,該緩衝區用來存放recv

C# socket 程式設計之 accept() 函式返回解析

accept() 函式會返回一個新的套接字,這個新的套接字在伺服器端與客戶端進行通訊。 伺服器端的繫結監聽是一個套接字,與客戶端通訊的是另一個套接字(accept函式返回的套接字,注意這裡不是返回客戶端的套接字,返回的套接字是新建立在伺服器上的,與客戶端收發訊息用的) 下面這段程式碼,是

recv函式返回說明

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

opencv之type()函式返回對應表

opencv之type()函式返回值對應表 cv::Mat 類的物件有一個成員函式 type() 用來返回矩陣元素的資料型別,返回值是 int 型別,不同的返回值代表不同的型別。 int Mat::type() const 返回值與具體型別對應關係表: | |C1| C2| C3| C4| --|--|

建構函式返回

建構函式返回值 For purposes other than simple initialization, classes can have constructors. Constructors are blocks of statements that can be used to in

按鍵精靈Q語言-怎麼使用自定義函式返回

按鍵精靈怎麼使用自定義函式返回值? a i MessageBox i Function a(i) i=100 End Function 就是想彈出100 aiMessageBoxiFunctiona(i)i=100EndFunction就是想讓它彈出的是100怎麼獲得自定義函式中的值呢?...展

風火程式設計--flask檢視函式返回

flask檢視函式返回json資料 原始模式 data_json = json.dumps({"errcode": "0", "errms": "成功", "data": data}) return data_json, 200, {"Contant-Type": "Applic

C++ 引用作為函式返回

(1)以引用返回函式值,定義函式時需要在函式名前加 & (2)用引用返回一個函式值的最大好處是,在記憶體中不產生被返回值的副本。 引用作為返回值,必須遵守以下規則: (1)不能返回區域性變數的引用。主要原因是區域性變數會在函式返回後被銷燬,因此被返回的引用就成為了

函式的文件說明,函式引數,函式返回

def test(a,b): … “用來完成對2個數求和” … print("%d"%(a+b)) … test(11,22) 33 如果執行,以下程式碼 h

引用作為函式返回的分析

  例如,下面的程式是有關引用返回的4種形式:     //*********************     //**   ch9_6.cpp  **     //*******************