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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux Shell函数返回值

發布時間:2024/4/13 linux 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux Shell函数返回值 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

1) return 語句
shell函數的返回值,可以和其他語言的返回值一樣,通過return語句返回。
示例:

[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"??

  • 結果:

    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

    先定義了一個函數mytest,根據它輸入的參數是否為1來return 1或者return 0.
    獲取函數的返回值通過調用函數,或者最后執行的值獲得。
    另外,可以直接用函數的返回值用作if的判斷。
    注意:return只能用來返回整數值,且和c的區別是返回為正確,其他的值為錯誤。


    2) argv全局變量

    這種就類似于C語言中的全局變量(或環境變量)。

    示例:

    [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"??

  • 結果:

    mytest2
    args 1
    return 0

    g_var=1


    函數mytest2通過修改全局變量的值,來返回結果。


    注:?以上兩個方法失效的時候

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

    [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 文件中的內容如下:

    456:kkk
    123:yxb
    123:test

    結果:

    yxb
    mytest3 here?
    1

    yxb
    g_var=0
    mytest4 here?
    1

    g_var=
    可以看到mytest3在return了以后其實沒有直接返回,而是執行了循環體后的語句,同時看到mytest4中也是一樣,同時,在mytest4中,對全局變量的修改也無濟于事,全局變量的值根本就沒有改變。這個是什么原因那?
    筆者認為,之所以return語句沒有直接返回,是因為return語句是在管道中執行的,管道其實是另一個子進程,而return只是從子進程中返回而已,只是while語句結束了。而函數體之后的語句會繼續執行。
    同理,全局變量在子進程中進行了修改,但是子進程的修改沒有辦法反應到父進程中,全局變量只是作為一個環境變量傳入子進程,子進程修改自己的環境變量,不會影響到父進程。
    因此在寫shell函數的時候,用到管道(cmd &后臺進程也一樣)的時候一定要清楚此刻是從什么地方返回。


    3) echo 返回值

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

    示例:

    [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??

  • 結果:
    $? = 0
    result = 0

    have yxb, result is 0

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


    轉載于:https://my.oschina.net/hanruikai/blog/335845

    超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

    總結

    以上是生活随笔為你收集整理的Linux Shell函数返回值的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。