Chinaunix首页 | 论坛 | 博客
  • 博客访问: 513079
  • 博文数量: 174
  • 博客积分: 8001
  • 博客等级: 中将
  • 技术积分: 1840
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-04 19:30
文章分类

全部博文(174)

文章存档

2011年(1)

2010年(24)

2009年(149)

我的朋友

分类: LINUX

2009-05-20 16:11:25

shell的函数的返回值只能是字符串或者整数。事实上,整数只是一种特殊的字符串,这种字符串能够被解释为表达式使用。
如果是返回整数:

  1 #!/bin/sh
  2
  3 add()
  4 {
  5     result=$(($1+$2))
  6     return $result
  7 }
  8
  9 main()
 10 {
 11     if [ $# = 2 ]; then
 12         add $1 $2
 13         retval=$?
 14         echo "$retval"
 15     else
 16         echo "usage: $0 p1 p2"
 17     fi
 18 }
 19
 20 main $@

使用$?来得到上一条命令的退出码,从而得到函数的返回值。

PS:我试图使shell里的函数的行为和C接近。规则是一样的:不要轻易使用全局变量。尽量模块化编程。虽然main函数这样写,有些冗余,但是这样才接近C,因为main也是一个函数。是一个执行点。但是,shell里的=和+等运算符,如果不是条件表达式,我决定两边不加空格。因为像赋值操作:

retval=$?

如果加了空格就被解释为:retval 是一条单独的命令,所以统一为不加。

而条件表达式的情况下,因为不加就会将=后面的一起解释为一个变量,也是错误的。统一为加。

如果是返回字符串:

  1 #!/bin/sh
  2
  3 add()
  4 {
  5     result=$(($1+$2))
  6     echo $result
  7 }
  8
  9 main()
 10 {
 11     if [ $# = 2 ]; then
 12         retval=$(add $1 $2)
 13         echo "$retval"
 14     else
 15         echo "usage: $0 p1 p2"
 16     fi
 17 }
 18
 19 main $@

函数如果没有return,那么将返回最后一条命令的退出码。利用这一点,就可以获得字符串形式的返回值。

PS:
有时候你需要某个参数是由几个分隔的部分组成的,例如
sh test.sh "a b"
使用上面的main $@将被解析成a b两个参数。而使用main "$@"可以仍然作为一个参数传递,通常情况 下,双引号表示作为一个整体,而不要解析
另外,像
sh test.sh $prefix/a
的$prefix会事先被解析,如果不存在,就会变成/a,使用字符串"$prefix/a"也不能改变这一点。因为字符串里的变量会被解析。这时候你可以用":prefix"代表这是要在脚本里由另一个变量替换的参数。使用:而不要使用#,%,^等可能在某些地方引起歧义的符号。
阅读(1166) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~