shell函数(调用、返回值,返回值获取)

Shell函数返回值,经常使用的两种方式:returnechojavascript

1) return 语句
shell函数的返回值,能够和其余语言的返回值同样,经过return语句返回。
示例1:java

[devadmin@swarm1 pos-gateway]$ 
[devadmin@swarm1 pos-gateway]$ 
[devadmin@swarm1 pos-gateway]$ #!/bin/sh  
[devadmin@swarm1 pos-gateway]$ function mytest()  
> {  
>     echo "arg1 = $1"  
>     if [ $1 = "1" ] ;then  
>         return 'ret1'
>     else  
>         return 'ret0'
>     fi  
> }
[devadmin@swarm1 pos-gateway]$ mytest 1
arg1 = 1
-bash: return: ret1: numeric argument required
[devadmin@swarm1 pos-gateway]$ 

“numeric argument required”错误:shell

Shell 函数返回值只能是整形数值,通常是用来表示函数执行成功与否的,0表示成功,其余值表示失败。于是用函数返回值来返回函数执行结果是不合适的。若是要硬生生地return某个计算结果,好比一个字符串,每每会获得错误提示:“numeric
argument required”。
若是必定要让函数返回一个或多个值,能够定义全局变量,函数将计算结果赋给全局变量,而后脚本中其余地方经过访问全局变量,就能够得到那个函数“返回”的一个或多个执行结果了。安全

 

从新修改下示例2:bash

[devadmin@swarm1 pos-gateway]$ function mytest()   {       echo "arg1 = $1"  ;     if [ $1 = "1" ] ;then           return 100;     else           return 200;     fi  ; }
[devadmin@swarm1 pos-gateway]$ 
[devadmin@swarm1 pos-gateway]$ 
[devadmin@swarm1 pos-gateway]$ mytest 1
arg1 = 1
[devadmin@swarm1 pos-gateway]$ echo $?
100
[devadmin@swarm1 pos-gateway]$ mytest 2
arg1 = 2
[devadmin@swarm1 pos-gateway]$ echo $?
200
[devadmin@swarm1 pos-gateway]$ 

示例3:函数

[devadmin@swarm1 pos-gateway]$ if mytest 1; then
> echo "mytest 1"
> fi
arg1 = 1
[devadmin@swarm1 pos-gateway]$ 

说明:先定义了一个函数mytest,根据它输入的参数是否为1来return 100或者return 200。ui

A、如何调用shell函数(执行函数):函数名 参数spa

B、获取shell函数结果:$?.net

C、另外,能够直接用函数的返回值用做if的判断。(示例3)调试

注意:return只能用来返回整数值,且和c的区别是返回为正确,其余的值为错误

 

2) argv全局变量

这种就相似于C语言中的全局变量(或环境变量)。

示例:

#!/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经过修改全局变量(g_var)的值,来返回结果。

注: 以上两个方法失效的时候,以上介绍的这两种方法在通常状况下都是好使的,但也有例外。

示例:

#!/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中,函数的返回值有一个很是安全的返回方式,即经过输出到标准输出返回。由于子进程会继承父进程的标准输出,所以,子进程的输出也就直接反应到父进程。

示例4:

#!/bin/sh  
function test()  
{  
    echo "arg1 = $1"  
    if [ $1 = "1" ] ;then  
        echo "1"  
    else  
        echo "0"  
    fi  
}  
  
echo   
echo "test 1"  
test 1  

  
echo   
echo "test 0"  
test 0  

  
echo   
echo "test 2"  
test 2

结果:

test 1
arg1 = 1
1

test 0
arg1 = 0
0

test 2
arg1 = 2
0

怎么?有没有搞错,这两个函数几乎没什么区别,对,它几乎就是return和echo不同,可是有一点必定要注意,不能向标准输出一些不是结果的东西(也就是说,不能随便echo一些不须要的信息),好比调试信息,这些信息能够重定向到一个文件中解决,特别要注意的是,脚本中用到其它相似grep这样的命令的时候,必定要记得1>/dev/null 2>&1来空这些输出信息输出到空设备,避免这些命令的输出。

#! /bin/sh
function test()
{
        echo "test here"
        return 100
}
DD=`test`
#echo excute over
echo "return: $?"
echo "DD: $DD"

如上shell代码段,执行结果是

return: 100
DD: test here

若是 把#echo excute over注释去掉,执行结果是

excute over
return: 0
DD: test here

也就是说:$?是接收上一条函数的执行结果,在例一中,$?接收test函数的执行结果,执行结果其实就是其返回值,就是return 传出来的数值(return只能是数字,不能是字符串之类的),若是函数中没有显式调用return返回出来状态,那么系统会使用函数中最后一条shell指令的执行结果做为返回值,若是函数test()最后一条指令调用其余函数,如:test1(),那么test的返回值就是test1的返回值。

DD是做为一个变量接收函数的标准输出,好比echo产生出来的信息,不包括报错之类的信息,如上若是函数test中调用test1,那么test和test1中的标准输出都会赋值给变量DD.

注意:DD=`test` , ` `符号不是单引号‘’,而是ESC下面的那个符号,该句话的意思是执行函数test结果赋值给DD,若是是单引号的话这句话是把字符串“test”赋值给变量DD,注意,这句话的执行结果不是赋值是否成功,而是函数的执行状态

 

总结:因此,能够总结一下函数返回值获取的方法:

1)用变量接收函数返回值,函数用echo等标准输出将要返回的东西打印出来。

2)用$?来接收函数的执行状态,可是$?要紧跟在函数调用处的后面。

相关文章
相关标签/搜索