背景
如今,不會(huì)Linux的程序員都不意思說自己是程序員,而不會(huì)shell編程就不能說自己會(huì)Linux。通過shell編程,寫一些工具批處理的時(shí)候,經(jīng)常需要自定義函數(shù)。更復(fù)雜點(diǎn)的情況下,可能有需要返回一個(gè)值。
由于在shell的世界中,并不像其他編程語言,它不支持我們所熟悉的方法返回。本文一起總結(jié)一下如何優(yōu)雅的解決返回值問題?
測(cè)試程序
我們一般通過$?來獲取上一個(gè)語句的輸出。看一下下面得測(cè)試語句:
新建testReturn腳本
returnString(){ return $1}returnString $1result=$?echo "result=$result"現(xiàn)在我們有一個(gè)testReturn的腳本,里面有一個(gè)returnString的方法,我們希望它能夠直接返回我們輸入的參數(shù)。
當(dāng)我們分別以hello,500,12作為輸入?yún)?shù)時(shí),他的執(zhí)行和輸出情況是一樣的么?
./testReturn hello./testReturn 500./testReturn 12
在心中試著猜一下可能的情況,現(xiàn)在我們來揭曉答案:
程序輸出情況
在執(zhí)行hello的時(shí)候,并沒有輸出hello,而是報(bào)了一個(gè)return只接受數(shù)字類型的錯(cuò)誤
aven-mac-pro-2:avenwu.github.io aven$ ./testReturn hello./testReturn: line 23: return: hello: numeric argument requiredresult=255
在執(zhí)行500的時(shí)候,頁沒有輸出500,而是輸出了244
aven-mac-pro-2:avenwu.github.io aven$ ./testReturn 500result=244
執(zhí)行12的時(shí)候,終于正確了,返回12
aven-mac-pro-2:avenwu.github.io aven$ ./testReturn 12result=12
異常分析
現(xiàn)在我們分析一下returnString這個(gè)方法,為什么會(huì)有這么多種輸出情況呢?
首先他的寫法顯然是不嚴(yán)謹(jǐn)?shù)模膊皇峭耆e(cuò)誤,比如輸入12他就正確返回了。
return本身是shell里面的buildin函數(shù),筆者總結(jié)了下,他有以下幾個(gè)特征:
return可以返回?cái)?shù)字狀態(tài),常常用于返回0,1,標(biāo)識(shí)一個(gè)函數(shù)執(zhí)行后是否成功 注意return不可以返回非數(shù)字類型 同時(shí)數(shù)字類型也有可能發(fā)生溢出現(xiàn)象全局變量
如果我們就是要返回一個(gè)字符串,怎么辦呢?可以通過定義全局變量來進(jìn)行賦值,類似于靜態(tài)變量/成員變量的寫法,我們讓他的作用域穿透整個(gè)上下文。
result=""returnString(){ result=$1}returnString $1echo "result=$result"再看一下輸出,得到了我們需要的結(jié)果:
aven-mac-pro-2:avenwu.github.io aven$ ./testReturn helloresult=helloaven-mac-pro-2:avenwu.github.io aven$ ./testReturn 500result=500aven-mac-pro-2:avenwu.github.io aven$ ./testReturn 12result=12
但是這樣寫,會(huì)污染全局變量,并且result這個(gè)變量很容易在內(nèi)部和外部都被修改,導(dǎo)致內(nèi)部修改失效。
新聞熱點(diǎn)
疑難解答
網(wǎng)友關(guān)注