Shell函式返回值
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 ** //*******************