当前位置: > 华清远见教育科技集团 > 嵌入式学习 > 讲师博文 > Shell中函数调用方式研究
Shell中函数调用方式研究
时间:2016-12-13作者:华清远见

shell中函数的调用方式有两种,如下图:

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

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

[cpp] view plaincopy
        1. fun()
        2. {
        3.     return (1+2);
        4. }

[cpp] view plaincopy
        1. main()
        2. {
        3.     a = fun();
        4.     ...............
        5. }

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

所以请看以下程序:

[cpp] view plaincopy
        1. #!/bin/sh
        2.
        3. check_user()
        4. {
        5.     n=`cat /etc/passwd | cut -d ":" -f 1 | grep "^$1$" -Rn | cut -d ":" -f 1`
        6.     echo $n

[cpp] view plaincopy
        1.     #这里是使用echo语句,将结果输出到标准输出上,所以在主程序中可以使用变量接收
        2.
        3. }
        4.
        5. userinfo()
        6. {
        7.     userinfo=`head -$1 /etc/passwd | tail -1 | cut -d ":" -f 3,4`
        8.     echo $userinfo
        9.
        10. }
        11.
        12.while true
        13.do
        14.
        15. read username
        16. m=`check_user $username`

[cpp] view plaincopy
        1. #使用变量接收函数check_user传递的值
        2.
        3. if [ -n "$m" ]
        4. then
        5.     userinfo $m
        6.     exit
        7. else
        8.     echo "$username is not exit!"
        9.
        10. fi
        11.
        12. done

而函数的第二种调用方式,是使用$?来接收上一程序的返回值状态,也就是return返回的值。

下面程序中,if判断后,return 0 或者 1,在这里,我们就可以使用$?接收return的值,然后

存储下来,继而进行下一步的判断!

[cpp] view plaincopy
        1. check_user()
        2. {
        3.     n=`cat /etc/passwd | cut -d ":" -f 1 | grep -n "^$1$"| cut -d ":" -f 1`
        4.     if [ -z "$n" ]
        5.     then
        6.         return 0
        7.     else
        8.         return 1
        9.     fi
        10. }
        11.
        12. show_userinfo()
        13. {
        14.     userinfo=`head -$n /etc/passwd | tail -1 | cut -d ":" -f 1,3,4`
        15.     echo $userinfo
        16. }
        17.
        18. echo "input username : "
        19. read username
        20.
        21. check_user $username
        22. num=$?
        23.
        24. if [ $num -eq 0 ]
        25. then
        26.     echo "The user '$username' is not exist."
        27.     exit
        28. else
        29.     show_userinfo $n
        30. fi

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

发表评论
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)