shell函数返回值接收问题

25 篇文章 0 订阅
[cpp]  view plain  copy
  1.   

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

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

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

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

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

这实际上是将函数的返回值,也就是return的值复制给变量a!可是,大家注意:

shell中函数调用的第一种方式,是将标准输出传递给主程序的变量,而不是返回值!


所以请看以下程序:


[cpp]  view plain  copy
  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 plain  copy
  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 plain  copy
  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 plain  copy
  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  

上面两个程序的执行结果是一样的,但是要注意着两种函数的不同调用方式,以及其返回给

主调程序的到底是什么。明白了这一点,才能准确知道到底使用何种方式接收返回值!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值