日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

Linux Shell函数返回值

發(fā)布時(shí)間:2024/4/13 linux 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux Shell函数返回值 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。