现在的位置: 首页 > 综合 > 正文

shell(4) 函数.doc

2013年06月17日 ⁄ 综合 ⁄ 共 1233字 ⁄ 字号 评论关闭

1)



创建

function
name{

      
...

}

或:

name(){

      

}

 

2)



调用

直接使用函数名,函数定义后才可以调用;

函数同名时新定义将覆盖老的定义,并且无告警;

 

3)



退出

使用
return

 

4)



返回值

函数退出状态,可使用变量
$?
获得——
$?
总是最后一条命令的结果,因此函数返回后需尽快获取返回值,否则会被新的命令的返回覆盖;

l        



默认返回值为最后一条命令的返回值;

l        



使用“
return n
”返回,
n
为整数,范围
0

255

TBD
,只能使用
$?
获得结果?

l        



使用
shell
变量存储返回值,可用于任意返回值类型——使用
echo
输出

eg:

function
a {

   
echo "xxxx"

   
read -t 3 -p "input sth" sth   
#


输出到
STDOUT


input sth

不会作为返回的一部分

   
echo 1000

   
echo $sth

}

 

rlt=`a`    
      
#a


的返回值保存在
rlt

echo
$rlt 
      
#rlt


的值为所有
echo


输出的组合



如果采取例子里的方式,则函数被作为一个子进程,其中的
exit
不能用于退出脚本;此外,仍然可以使用
$?
获得函数
return
(或
exit
)的结果;

TBD

:怎样让其中的部分
echo
不作为函数输出?

方法:可以把这个
echo
重定向到
STDERR

 

5)



传参

bash
将函数作为小型脚本处理,也可传递参数,函数名为
$0
,参数为
$1

$2

传参的调用方式

result=`a 1 abc`

 

6)



全局变量

脚本中定义的变量默认都是全局变量,函数可访问其外部定义的变量——不好的风格

eg:

function
a {

   
c=dddd         
#


函数中定义的变量

   
echo $c

}

c=1111

echo
$c

a                  
      
#c


值被更改

echo
$c

 

7)



局部变量,使用
local

eg:

function
a {

   
local c=dddd 
#


定义局部变量

   
echo $c

}

c=1111

echo
$c

a

echo
$c         
#c


值不被函数
a

更改

 

8)



递归

eg
,实现阶乘
x!=x*(x-1)!

function
x {

   
if [ $1 -eq 1 ]; then

      
echo $1

   
else

      
local tmp=$[$1-1]

      
echo $[$1 * `x $tmp`]

   
fi

}

 

ret=`x
5`

echo $ret

 

9)



函数库

创建:将函数写到独立文件中即可,如
aaa.t

库的问题:函数与环境变量一样,仅在创建它的
shell
中有效;

使用:
source
命令,实现在当前
shell
中执行命令的功能;

source
的别名:
dot operator

不使用
source
命令则将创建新的
shell
执行命令,从而面临上述问题;

eg
,引用
aaa
库:

.
./aaa.t

 

source
命令相当于
#include
,用于引入文件,之后文件中的函数就可以直接调用了

 

 

抱歉!评论已关闭.