首页 > 代码库 > 1.12函数和参数

1.12函数和参数

我们可以创建执行特定任务的函数,也可以创建能够接受参数的函数

1)定义函数

function fname()

{

  statements;               

或者

fname()

{

  statements;

}

2)只需要使用函数名就可以调用某个函数

$ fname; #意思是执行函数

3)参数可以传递给函数,并由脚本进行访问:

$ fname arg1 arg2 ;#传递参数

eg:在函数fname中,包含了各种访问函数参数的方法

fname()

{

  echo $1,$2;#访问参数1和参数2

  echo "$@";#以列表的方式一次性打印所有参数

  echo "$*";#类似于$@,但是参数被作为单个实体

  return 0;#返回值

类似的,参数可以传递给脚本并通过script:$0(脚本名)访问。??????

$1和$2分别是第一个和第二个参数,以此类推。

"$@"被扩展成“$1” "$2" "$3"等

“$*”被扩展成“$1c$2c$3c”,其中c是IFS的第一个字符。

"$@"要比“$*”用的多。由于“$*”将所有的参数当做单个字符串,因此它很少被使用。

注意函数在脚本中定义之后,还需要调用,如果该函数需要参数,则还需要在函数名后面加上参数!!!!

补充内容:

1、递归函数

在bash中,函数同样支持递归(可以调用自身的函数),如

F()

{

  echo $1;

  F hello;

  sleep1;

}

Fork炸弹

:() {:|:&};:

这个递归函数能够调用自身,不断地生成新的进程,最终造成拒绝服务攻击。函数调用前的&将子进程放入后台。这段危险的代码会分支出2大量的进程,因而称为Fork炸弹。理解上面可参考http://en.wikipedia.org/wikiFork_bomb。

可以通过修改配置文件/etc/security/limits.conf来限制可生成的最大进程数来避开这枚炸弹。

2、导出函数

函数也能像环境变量一样用export导出,如此一来,函数的作用域就可以扩展到子进程中,如

export -f fname

3、读取命令返回值(状态)

通过下面的方式获取命令和返回值

cmd;

echo $?;

$?会给出命令cmd的返回值。

返回值被称为退出状态。它可用于分析命令执行成功与否。如

#!/bin/bash

CMD="command"#command指代你要检测退出状态的目标命令

$CMD

if [ $? -eq 0]

then 

     echo "$CMD executed successfully"

else

   echo "$CMD executed unsuccessfully"

fi

4、向命令传递参数

命令的参数能够以不同的格式进行传递。假设-p、-v是可选项,-k、-N是另一个可以接受数字的选项,同时该命令还接受一个文件名作为参数,那么,它有如下几种执行方式:

$command -p -v -k 1 file

$command -pv -k 1 file

$command -pvk 1 file

$command file -pvk 1

 

1.12函数和参数