zoukankan      html  css  js  c++  java
  • SHELL函数处理

    SHELL函数调用分为两种:

    第一种方式,有点像C语言调用函数的风格,直接把函数的执行结果复制给变量!不过,这个赋值过程和C语言的函数赋值是不一样的!

    C语言中,函数调用,是将函数的返回值返回给被调函数,如:

    fun()
    {
         return (1+2);
    }
    main()
    {
        a = fun();
        ...............
    }

    这实际上是将函数的返回值,也就是return的值复制给变量a!可是,大家注意:shell中函数调用的第一种方式,是将标准输出传递给主程序的变量,而不是返回值!请看以下程序 test.sh:

    #!/bin/sh 
    
    check_user()
    {
        n=`cat /etc/passwd | cut -d ":" -f 1 | grep "^$1$" -Rn | cut -d ":" -f 1`
        echo $n
        #这里是使用echo语句,将结果输出到标准输出上,所以在主程序中可以使用变量接收
    }
    
    userinfo()
    {
        userinfo=`head -$1 /etc/passwd | tail -1 | cut -d ":" -f 3,4`
        echo $userinfo
    }
    
    while true
    do
            read username
            m=`check_user $username`
            #使用变量接收函数check_user传递的值
    
            if [ -n "$m" ]
            then
               userinfo $m
               exit
            else
                echo "$username is not exit!" 
            fi
    done

    测试代码:

    [qiu.li@l-tdata1.tkt.cn6 ~]$ ./test.sh 
    dd
    dd is not exit!
    qiu.li
    40006:1004

    而函数的第二种调用方式,是使用$?来接收上一程序的返回值状态,也就是return返回的值。下面程序中,if判断后,return 0 或者 1,在这里,我们就可以使用$?接收return的值,然后存储下来,继而进行下一步的判断!

    check_user()
    {
        n=`cat /etc/passwd | cut -d ":" -f 1 | grep -n "^$1$"| cut -d ":" -f 1`
        if [ -z "$n" ]
        then
            return 0
        else
            return 1
        fi
    }
    
    show_userinfo()
    {
        userinfo=`head -$n /etc/passwd | tail -1 | cut -d ":" -f 1,3,4`
        echo $userinfo
    }
    
    echo  "input username : "
    read username
    
    check_user $username
    num=$?
    
    if [ $num -eq 0 ]
    then
        echo "The user '$username' is not exist."
        exit
    else
        show_userinfo $n
    fi

    上面两个程序的执行结果是一样的,但是要注意着两种函数的不同调用方式,以及其返回给主调程序的到底是什么。明白了这一点,才能准确知道到底使用何种方式接收返回值! 

  • 相关阅读:
    5款强大的Java Web开发工具
    [Visual Studio] 重置默认设置 还原默认设置
    [Visual Studio] VS2012调试时很慢的解决方案
    SQL 语句与性能之执行顺序
    SQL 语句与性能之联合查询和联合分类查询
    使用SHFB(Sandcastle Help File Builder)建立MSDN风格的代码文档
    循序渐进地代码重构
    博客收藏
    [已解决]:调用 LoadLibraryEx 失败,在 ISAPI 筛选器 "c:WindowsMicrosoft.NETFrameworkv4.0.30319\aspnet_filter.
    [Visual Studio] .vsix项目模板制作
  • 原文地址:https://www.cnblogs.com/liqiu/p/4113857.html
Copyright © 2011-2022 走看看