shell(4) 函数.doc

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 ,用于引入文件,之后文件中的函数就可以直接调用了

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值