Linux Shell函数返回值
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
1) return 語(yǔ)句
shell函數(shù)的返回值,可以和其他語(yǔ)言的返回值一樣,通過(guò)return語(yǔ)句返回。
示例:
[javascript]?view plaincopyprint?
#!/bin/bash?-??
function?mytest()??
{??
????echo?"arg1?=?$1"??
????if?[?$1?=?"1"?]?;then??
????????return?1??
????else??
????????return?0??
????fi??
}??
??
echo???
echo?"mytest?1"??
mytest?1??
echo?$??????????#?print?return?result??
??
echo???
echo?"mytest?0"??
mytest?0??
echo?$??????????#?print?return?result??
??
echo???
echo?"mytest?2"??
mytest?2??
echo?$??????????#?print?return?result??
??
??
echo??
echo?"mytest?1?=?"`mytest?1`??
if??mytest?1?;?then??
????echo?"mytest?1"??
fi??
??
echo??
echo?"mytest?0?=?"`mytest?0`??
if??mytest?0?;?then??
????echo?"mytest?0"??
fi??
??
echo??
echo?"if?fasle"?#?if?0?is?error??
if?false;?then??
????echo?"mytest?0"??
fi??
??
??
echo??
mytest?1??
res=`echo?$?`???#?get?return?result??
if?[?$res?=?"1"?];?then??
????echo?"mytest?1"??
fi??
??
echo??
mytest?0??
res=`echo?$?`???#?get?return?result??
if?[?$res?=?"0"?];?then??
????echo?"mytest?0"??
fi??
??
??
??
echo???
echo?"end"??
結(jié)果:
mytest 1
arg1 = 1
1
mytest 0
arg1 = 0
0
mytest 2
arg1 = 2
0
mytest 1 = arg1 = 1
arg1 = 1
mytest 0 = arg1 = 0
arg1 = 0
mytest 0
if fasle
arg1 = 1
mytest 1
arg1 = 0
mytest 0
end
先定義了一個(gè)函數(shù)mytest,根據(jù)它輸入的參數(shù)是否為1來(lái)return 1或者return 0.
獲取函數(shù)的返回值通過(guò)調(diào)用函數(shù),或者最后執(zhí)行的值獲得。
另外,可以直接用函數(shù)的返回值用作if的判斷。
注意:return只能用來(lái)返回整數(shù)值,且和c的區(qū)別是返回為正確,其他的值為錯(cuò)誤。
2) argv全局變量
這種就類(lèi)似于C語(yǔ)言中的全局變量(或環(huán)境變量)。
示例:
[javascript]?view plaincopyprint?
#!/bin/bash?-??
??
g_var=??
function?mytest2()??
{??
????echo?"mytest2"??
????echo?"args?$1"??
????g_var=$1??
??
????return?0??
}??
??
mytest2?1??
echo?"return?$?"??
??
echo??
echo?"g_var=$g_var"??
結(jié)果:
mytest2
args 1
return 0
g_var=1
函數(shù)mytest2通過(guò)修改全局變量的值,來(lái)返回結(jié)果。
注:?以上兩個(gè)方法失效的時(shí)候
以上介紹的這兩種方法在一般情況下都是好使的,但也有例外。
示例:
[javascript]?view plaincopyprint?
#!/bin/bash?-??
??
??
function?mytest3()??
{??
????grep?"123"?test.txt?|?awk?-F:?'{print?$2}'?|?while?read?line?;do??
????????echo?"$line"??
????????if?[?$line?=?"yxb"?];?then??
????????????return?0????#?return?to?pipe?only??
????????fi??
????done??
??
????echo?"mytest3?here?"??
????return?1????????????#?return?to?main?process??
}??
??
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????#?return?to?pipe?only??
????????fi??
????done??
??
????echo?"mytest4?here?"??
????return?1??
}??
??
mytest3??
echo?$???
??
echo??
mytest4??
echo?$???
??
echo??
echo?"g_var=$g_var"??
其中,test.txt 文件中的內(nèi)容如下:
456:kkk
123:yxb
123:test
結(jié)果:
yxb
mytest3 here?
1
yxb
g_var=0
mytest4 here?
1
g_var=
可以看到mytest3在return了以后其實(shí)沒(méi)有直接返回,而是執(zhí)行了循環(huán)體后的語(yǔ)句,同時(shí)看到mytest4中也是一樣,同時(shí),在mytest4中,對(duì)全局變量的修改也無(wú)濟(jì)于事,全局變量的值根本就沒(méi)有改變。這個(gè)是什么原因那?
筆者認(rèn)為,之所以return語(yǔ)句沒(méi)有直接返回,是因?yàn)閞eturn語(yǔ)句是在管道中執(zhí)行的,管道其實(shí)是另一個(gè)子進(jìn)程,而return只是從子進(jìn)程中返回而已,只是while語(yǔ)句結(jié)束了。而函數(shù)體之后的語(yǔ)句會(huì)繼續(xù)執(zhí)行。
同理,全局變量在子進(jìn)程中進(jìn)行了修改,但是子進(jìn)程的修改沒(méi)有辦法反應(yīng)到父進(jìn)程中,全局變量只是作為一個(gè)環(huán)境變量傳入子進(jìn)程,子進(jìn)程修改自己的環(huán)境變量,不會(huì)影響到父進(jìn)程。
因此在寫(xiě)shell函數(shù)的時(shí)候,用到管道(cmd &后臺(tái)進(jìn)程也一樣)的時(shí)候一定要清楚此刻是從什么地方返回。
3) echo 返回值
其實(shí)在shell中,函數(shù)的返回值有一個(gè)非常安全的返回方式,即通過(guò)輸出到標(biāo)準(zhǔn)輸出返回。因?yàn)樽舆M(jìn)程會(huì)繼承父進(jìn)程的標(biāo)準(zhǔn)輸出,因此,子進(jìn)程的輸出也就直接反應(yīng)到父進(jìn)程。因此不存在上面提到的由于管道導(dǎo)致返回值失效的情況。
在外邊只需要獲取函數(shù)的返回值即可。
示例:
[javascript]?view plaincopyprint?
#!/bin/bash???
?
##############################################??
#?Author?:?IT-Homer??
#?Date???:?2012-09-06???
#?Blog???:?http://blog.csdn.net/sunboy_2050??
##############################################??
??
function?mytest5()??
{??
????grep?"123"?test.txt?|?awk?-F:?'{print?$2}'?|?while?read?line;?do??
????????if?[?$line?=?"yxb"?];?then??
????????????echo?"0"????#?value?returned?first?by?this?function??
????????????return?0??
????????fi??
????done??
??
????return?1??
}??
??
echo?'$??=?'"$?"??
result=$(mytest5)??
??
echo?"result?=?$result"??
??
echo??
if?[?-z?$result?]???????#?string?is?null??
then??
????echo?"no?yxb.?result?is?empyt"??
else??
????echo?"have?yxb,?result?is?$result"??
fi??
結(jié)果:
$? = 0
result = 0
have yxb, result is 0
這個(gè)方式雖然好使,但是有一點(diǎn)一定要注意,不能向標(biāo)準(zhǔn)輸出一些不是結(jié)果的東西,比如調(diào)試信息,這些信息可以重定向到一個(gè)文件中解決,特別要注意的是,用到比如grep這樣的命令的時(shí)候,一定要記得1>/dev/null 2>&1來(lái)避免這些命令的輸出。
轉(zhuǎn)載于:https://my.oschina.net/hanruikai/blog/335845
超強(qiáng)干貨來(lái)襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的Linux Shell函数返回值的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 初学Android,字符串,数字,尺寸,
- 下一篇: linux和windows文件名称长度限