Linux shell中的函数调用实践

以下只在BASH下测试

shell中定义函数的方法为

function func_name()

{

函数体

[return]

}

 

函数体部分可以是任意的Shell命令,也可以调用其他的函数。

return后可跟数值0-255作为函数的返回值;如果不加,将以最后一条命令运行结果作为返回值。返回值将保存到变量"$?"中。

如果在函数中使用exit命令,可以退出整个脚本,通常情况,函数结束之后会返回调用函数的部分继续执行。

可以使用break语句来中断函数的执行。

 

declare f 可以显示定义的函数清单

declare F可以只显示定义的函数名

unset f 可以从Shell内存中删除函数

export f将函数输出给Shell

如果函数定义在别的文件中,可以通过source.命令引入。

 

函数的调用及返回值

函数定义好后就可以跟SHELL中其它命令一样使用,如”func_name 参数1参数2 ...”

下面列子能很好的说明函数的返回值:

1   #! /bin/bash

2

3   fSum 3 2

4   function fSum()

5   {

6     echo $1,$2;

7     return $(($1+$2));

8   }

9

10  fSum 5 7

11  echo $?

12

13  total=$(fSum 3 2)

14  echo total is \"$total\", return value is \"$?\"

输出结果

./test.sh: line 3: fSum: command not found

5,7

12

total is "3,2", return value is "5"

 

 

1). 当在第3行执行fSum时函数fSum还没有定义,所以SHELL报错”command not found”

2). 10行再次执行fSum时,函数体中的echo显示了传入的参数57,函数的返回值为12

3). 通过 total=$(fSum 3 2); 这种调用方法,函数的返回值在$?中,而直接通过=获得是函数中echo的输出。

其实通过$(func_name)的方式调用函数时,SHELL为此函数创建一个新的子SHELL=会把子SHELL的标准左边的变量,函数的返回值仍在变量$?中。

我们可以很容易的通过下面的例子来证实:

#! /bin/bash

 

function test()

{

  echo "i'm stdout"

  echo "i'm stderr" >&2

  return 10

}

 

echo "step 1"

test

echo $?

 

echo "step 2"

$(test)

echo $?

 

echo "step 3"

val=$(test)

echo \"$val\", return val \"$?\"

结果输出为

step 1

i'm stdout

i'm stderr

10

step 2

i'm stderr

./t.sh: line 15: i'm: command not found

127

step 3

i'm stderr

"i'm stdout", return val "10"

 

1). test方式调用函数,其使用的是于调用者一样的标准输出和标准错误。

2). $(test)方式调用函数,当前SHELL会先为函数调用创建一个子SHELL。子SHELL的标准错误与当前SHELL一样,标准输出会在函数结束后返回给当前SHELL。这里被当前SHELL当作命令来执行了,所以出现” i'm: command not found”的错误提示。如果把test函数中的” echo "i'm stdout"”改成” echo "pwd"”,刚才出现的错误会变成显示当前目录。

3). 以val=$(test)方式调用函数,当前SHELL会先为函数调用创建一个子SHELL。子SHELL的标准错误与当前SHELL一样,标准输出会在函数结束后返回给当前SHELL,然后被赋值给val。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值