亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Linux Shell > 正文

Linux Shell函數返回值

2020-07-27 19:00:18
字體:
來源:轉載
供稿:網友

Shell函數返回值,一般有3種方式:return,argv,echo

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

#!/bin/bash -function mytest(){  echo "arg1 = $1"  if [ $1 = "1" ] ;then    return 1  else    return 0  fi}echo echo "mytest 1"mytest 1echo $?     # print return resultecho echo "mytest 0"mytest 0echo $?     # print return resultecho echo "mytest 2"mytest 2echo $?     # print return resultechoecho "mytest 1 = "`mytest 1`if mytest 1 ; then  echo "mytest 1"fiechoecho "mytest 0 = "`mytest 0`if mytest 0 ; then  echo "mytest 0"fiechoecho "if fasle" # if 0 is errorif false; then  echo "mytest 0"fiechomytest 1res=`echo $?`  # get return resultif [ $res = "1" ]; then  echo "mytest 1"fiechomytest 0res=`echo $?`  # get return resultif [ $res = "0" ]; then  echo "mytest 0"fiecho 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語言中的全局變量(或環境變量)。
示例:

#!/bin/bash -g_var=function mytest2(){  echo "mytest2"  echo "args $1"  g_var=$1  return 0}mytest2 1echo "return $?"echoecho "g_var=$g_var"

結果:
mytest2
args 1
return 0

g_var=1

函數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  # 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}mytest3echo $?echomytest4echo $?echoecho "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中,函數的返回值有一個非常安全的返回方式,即通過輸出到標準輸出返回。因為子進程會繼承父進程的標準輸出,因此,子進程的輸出也就直接反應到父進程。因此不存在上面提到的由于管道導致返回值失效的情況。
在外邊只需要獲取函數的返回值即可。
示例:

#!/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"echoif [ -z $result ]    # string is nullthen  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來避免這些命令的輸出。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美老妇交乱视频| 亚洲午夜久久久影院| 亚洲图片在线综合| 亚洲午夜久久久影院| 日韩精品高清视频| 欧美日韩国产精品一区二区不卡中文| 97在线视频精品| 国模gogo一区二区大胆私拍| 日韩欧美成人精品| 国产精品三级美女白浆呻吟| 国产精品视频免费在线观看| 欧美日韩亚洲精品内裤| 高清亚洲成在人网站天堂| 插插插亚洲综合网| 亚洲男人7777| 亚洲精品成人av| 亚洲精品中文字幕女同| 日韩在线视频中文字幕| 精品久久久中文| 91精品久久久久久久久久入口| 欧美一区二三区| 亚洲国语精品自产拍在线观看| 欧美性理论片在线观看片免费| 久久中国妇女中文字幕| 深夜福利国产精品| 欧美精品videosex牲欧美| 亚洲a成v人在线观看| 精品久久久久久久中文字幕| 日韩精品视频在线| 亚洲电影第1页| 精品久久久久久中文字幕一区奶水| 中文字幕视频在线免费欧美日韩综合在线看| 91国产精品视频在线| 中文在线资源观看视频网站免费不卡| 最新的欧美黄色| 欧美性xxxxhd| 精品视频9999| 日本久久亚洲电影| 国产精品久久久av久久久| 国外成人在线播放| 人妖精品videosex性欧美| 日韩免费不卡av| 日韩高清a**址| 成人黄色av免费在线观看| 欧美极品在线视频| 欧美中文字幕视频| 国产精品久久久久9999| 国产一区二区三区视频免费| 亚洲精品影视在线观看| 亚洲天堂av在线免费观看| 欧美黑人狂野猛交老妇| 第一福利永久视频精品| 欧美乱大交xxxxx另类电影| 国产精品视频xxx| 亚洲成人激情在线| 欧美情侣性视频| 国产精品高清在线| 日韩一区视频在线| 91久久久久久久久久| 菠萝蜜影院一区二区免费| 国产成人高清激情视频在线观看| 国产精品www网站| 青青久久av北条麻妃黑人| 黄色一区二区在线观看| **欧美日韩vr在线| 亚洲久久久久久久久久| 久久精品色欧美aⅴ一区二区| 久久精品国产99国产精品澳门| 日韩成人网免费视频| 亚洲aⅴ男人的天堂在线观看| 精品国产依人香蕉在线精品| 欧美国产日本在线| 亚洲激情视频在线观看| 亚洲一品av免费观看| 热99久久精品| 亚洲品质视频自拍网| 国产精品尤物福利片在线观看| 精品成人国产在线观看男人呻吟| 最近2019中文字幕在线高清| 久99九色视频在线观看| 欧美人与性动交a欧美精品| 深夜福利亚洲导航| 91在线高清视频| 国产精品成人aaaaa网站| 成人国产亚洲精品a区天堂华泰| 欧美激情国产精品| 精品综合久久久久久97| 国产精品自产拍在线观看| 97精品一区二区视频在线观看| 91视频国产精品| 日韩欧美一区二区在线| 国产成人91久久精品| 成人做爽爽免费视频| 精品久久久免费| 久久综合免费视频| 中文字幕亚洲一区二区三区五十路| 福利二区91精品bt7086| 欧美裸体xxxx极品少妇软件| 欧美激情网站在线观看| 欧洲美女免费图片一区| 亚洲精品免费网站| 欧美巨猛xxxx猛交黑人97人| 欧美疯狂性受xxxxx另类| 亚洲成色777777女色窝| 欧美成人在线免费| 欧美性感美女h网站在线观看免费| 久久久久国产精品免费| 欧美成人在线免费| 国产一区二区视频在线观看| 欧美乱妇高清无乱码| 久久中文久久字幕| 欧美日韩午夜视频在线观看| 中文字幕亚洲欧美日韩高清| 久久天天躁日日躁| 亚洲男人天堂视频| 欧美日韩在线视频观看| 国产成+人+综合+亚洲欧洲| 久久精品2019中文字幕| 日韩在线观看高清| 欧美极品少妇xxxxⅹ免费视频| 最近2019免费中文字幕视频三| 精品久久久久久久久久久久| 久久久久久国产精品三级玉女聊斋| 亚洲人成电影网| 亚洲va欧美va国产综合久久| 欧美成人午夜影院| 欧美激情2020午夜免费观看| 欧美噜噜久久久xxx| 国产精品一区二区三区在线播放| 日韩欧美高清在线视频| 成人黄色免费在线观看| 成人免费淫片视频软件| 久久久视频在线| 久久久噜噜噜久噜久久| 国产在线久久久| 亚洲综合中文字幕68页| 午夜精品视频网站| 91av在线视频观看| 成人国产精品免费视频| 欧美在线视频免费| 庆余年2免费日韩剧观看大牛| 国产精品自产拍在线观看| 久久精品影视伊人网| 久久久久久久久中文字幕| 大伊人狠狠躁夜夜躁av一区| 欧美久久精品一级黑人c片| 成人a在线观看| 色噜噜亚洲精品中文字幕| 国产激情999| 成人免费观看网址| 午夜精品久久久久久99热| 国产精品扒开腿做爽爽爽视频| 亚洲国产精品久久精品怡红院| 国产精品欧美一区二区三区奶水| 亚洲九九九在线观看| 成人动漫网站在线观看| 日产精品99久久久久久| 久久亚洲欧美日韩精品专区| 日韩欧美一区二区三区| www欧美日韩| 亚洲天堂免费在线| 中文字幕久久精品| 午夜精品久久久久久久白皮肤| 精品少妇v888av|