• shell调用函数返回值深入分析


    编写shell脚本过程中,我们经常会自定义一些函数,并根据函数的返回值不同来执行相应的流程,那么我们如何来获取函数的返回值呢?
    
    首先shell中调用函数有两种方式:
    第一种:value=`function_name [arg1 arg2 ......]`
    或
    第二种:function_name  [arg1 arg2 ......]
    echo $?
    
    

     

      这两种有什么区别呢?

    
    
    举个例子来说:
    
    
    [root@zejin240 ~]# cat test.sh 
    #!/bin/sh
    function aaa()
    {
       if [ "$1" -eq "1" ];then
         return 0
       elif [ "$1" -eq "2" ];then
         exit 1
       elif [ "$1" -eq "3" ];then
         echo "3" 
         echo "31" >&2 #no space after >
         echo "32"
       elif [ "$1" -eq "4" ];then
         a wrong commend
       fi
    }
    
    echo "begin"
    value1=`aaa 1`
    echo $?
    echo "value1=$value1"
    echo '---------------'
    
    value2=`aaa 2`
    echo $?
    echo "value2=$value2"
    echo '---------------'
    
    value3=`aaa 3`
    echo $?
    echo "value3=$value3"
    echo '---------------'
    
    value4=`aaa 4`
    echo $?
    echo "value4=$value4"
    
    echo "end"
    
    输出如下:
    [root@zejin240 ~]# sh test.sh 
    begin
    0
    value1=
    ---------------
    1
    value2=
    ---------------
    31
    0
    value3=3
    32
    ---------------
    test.sh: line 14: a: command not found
    127
    value4=
    ---------------
    end
    

    可以看到,value1 value2 value3 value4的值取决于函数中的标准输出的值,即函数体中的echo内容,注意value3的值,因为我们将31的输出定向到了标准错误输出,而不会出现在value3的值中。 而我们用$?获得的函数执行状态值时,可以看到,没有加return和exit的直接返回它上一条命令执行的状态值,所以echo "32"可以正常返回,所以$?的值为0,而a wrong command 由于不能正常执行,而返回了一个非0的整数。
    好了,那么让我们来看下面一个命令:

    [root@zejin240 ~]# /opt/lamp/mysql/bin/mysql -h192.168.1.240 -uDBA -p123 -ss -e 'show variables like "version"'
    Warning: Using a password on the command line interface can be insecure.
    version    5.6.16-log
    
    
    输出中出现了一个让人有点讨厌的警告,但是呢,当我把命令的值赋与变量aa时

    [root@zejin240 ~]# aa=`/opt/lamp/mysql/bin/mysql -h192.168.1.240 -uDBA -p123 -ss -e 'show variables like "version"'`
    Warning: Using a password on the command line interface can be insecure.
    [root@zejin240 ~]# echo "$aa"
    version    5.6.16-log
    
    

    你会发现,变量aa的值并没有包含那个警告信息。为什么呢,看了上面的分析能否知道原因呢 原因是这样子的,虽然在界面显示出来了警告信息,但这个警告信息是被重定向到标准错误输出的,并不会被赋值给变量aa,我是怎么知道的呢 我们可以这样做个实验:
    
    
    [root@zejin240 ~]# aa=`/opt/lamp/mysql/bin/mysql -h192.168.1.240 -uDBA -p123 -ss -e 'show variables like "version"' 2>&1 `
    [root@zejin240 ~]# echo "$aa"
    Warning: Using a password on the command line interface can be insecure.
    version    5.6.16-log
    
    
    
    
    
    我将标准错误输出重定位到标准输入,你看,这变量aa的值就包含警告信息了吧。
    当然我们也可以将标准输出重定向到空设备中:
    
    
    [root@zejin240 ~]# aa=`/opt/lamp/mysql/bin/mysql -h192.168.1.240 -uDBA -p123 -ss -e 'show variables like "version"' >/dev/null 2>&1`
    [root@zejin240 ~]# echo "$aa"

    
    
    
    你看,aa的值就为空了吧。(即使是定向到某个文件中输出也为空)

    
    
    总结:调用函数返回值时,不管方法一还是方法二,echo $?的值是一样的。而方法一中,即value=`function_name [arg1 arg2 ......]`,value的取值取决于调用命令的标准输出,没有标准输出即为空,我们一般用return值来返回函数的最后执行状态,(一般不用exit来返回,因为它直接调用时会直接结束整个shell,当然如果有特殊目的可以这样做),用echo来输出给到变量的值。

     

  • 相关阅读:
    io系列浅谈
    git 删除分支--本地分支和远程分支
    提问须知
    PDF 补丁丁 0.6.2.3691 测试版发布
    PDF 补丁丁 0.6.2.3689 测试版发布
    .Net调用接口处理时间过长,前端访问超时解决方案
    Abp用多个DbContext
    IDEA 报错 Could not autowire. No beans of 'UserMapper' type found(无法自动装配。找不到类型为 'UserMapper' 的 bean)解决IDEA中自动装配,找不到类型的bean问题
    springboot整合springmvc拦截器
    springboot自动配置原理
  • 原文地址:https://www.cnblogs.com/zejin2008/p/5149225.html
Copyright © 2020-2023  润新知