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