我们可以创建执行特定任务的函数,也可以创建能够接受参数的函数
1)定义函数
function fname()
{
statements;
}
或者
fname()
{
statements;
}
2)只需要使用函数名就可以调用某个函数
$ fname; #意思是执行函数
3)参数可以传递给函数,并由脚本进行访问:
$ fname arg1 arg2 ;#传递参数
eg:在函数fname中,包含了各种访问函数参数的方法
fname()
{
echo $1,$2;#访问参数1和参数2
echo "[email protected]";#以列表的方式一次性打印所有参数
echo "$*";#类似于[email protected],但是参数被作为单个实体
return 0;#返回值
}
类似的,参数可以传递给脚本并通过script:$0(脚本名)访问。??????
$1和$2分别是第一个和第二个参数,以此类推。
"[email protected]"被扩展成“$1” "$2" "$3"等
“$*”被扩展成“$1c$2c$3c”,其中c是IFS的第一个字符。
"[email protected]"要比“$*”用的多。由于“$*”将所有的参数当做单个字符串,因此它很少被使用。
注意函数在脚本中定义之后,还需要调用,如果该函数需要参数,则还需要在函数名后面加上参数!!!!
补充内容:
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