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"代表这是要在脚本里由另一个变量替换的参数。使用:而不要使用#,%,^等可能在某些地方引起歧义的符号。
阅读(1170) | 评论(0) | 转发(0) |