function fname(){ }
或者node
function_name(){ }
对于简单的函数,甚至能够是这样作 fname() { statement; }shell
直接写函数名便可。如 fname函数
传入的参数都是位置参数,没法传入形式参数以及设置默认参数,传入位置的参数以下:命令行
fname arg1 arg2
简单的函数例子以下:debug
fname(){ echo $1, $2; #访问参数1和参数2 echo "$@"; #以列表的方式一次性打印全部参数 echo "$*"; #相似于$@,可是全部参数被视为单个实体 return 0; #返回值 } fname a b
解释下不常见的参数:code
IFS解释:
IFS是shell脚本中的一个重要概念,在处理文本数据时,它是至关有用的。IFS能够是White Space(空白键)、Tab( 表格键)、Enter( 回车键)中的一个或几个。
IFS(Internal Field Seperator)在Linux的shell中预设的分隔符,用来把command line分解成word(字段)。
IFS的设置方法很简单,和普通变量设置方法相似:递归
IFS=":"
建议设置IFS前保存原IFS的值,在使用后及时恢复。dns
经过设置别名的方法设置一个命令,而后传入参数进去看看有什么效果进程
[root@dns-node2 tmp]# alias lsg='ls |grep ' [root@dns-node2 tmp]# lsg sh DaoJiShi.sh debugsh.sh testFunc.sh testSet.sh
咱们再写一个函数,接受一个位置参数,由此能够对比下别名的位置参数和函数的位置参数资源
[root@dns-node2 tmp]# getFile(){ ls |grep $1 ;} [root@dns-node2 tmp]# getFile txt output.txt [root@dns-node2 tmp]# getFile sh DaoJiShi.sh debugsh.sh testFunc.sh testSet.sh
在Bash中,函数一样支持递归调用(能够调用自身的函数)。例如, F() { echo $1; F hello;
sleep 1; } 。
Fork炸弹
递归函数是可以调用自身的函数。这种函数必须有退出条件,不然就会不断地
生成自身,直到系统耗尽全部的资源或是崩溃。
:(){ :|:& };:
这个函数会一直地生成新的进程,最终造成拒绝服务攻击。
函数调用前的 & 将子进程放入后台。这段危险的代码可以不停地衍生出进程,
于是被称为Fork炸弹。
能够经过修改配置文件/etc/security/limits.conf中的 nproc 来限制可生成的最
大进程数,进而阻止这种攻击。
下面的语句将全部用户可生成的进程数限制为100:
hard nproc 100
经过export -f fname
导出函数, 如此一来,函数的做用域就能够扩展到子进程中,也就是子进程也可使用这个函数了。
[root@dns-node2 tmp]# cat testExportFunc.sh getFile sh [root@dns-node2 tmp]# sh testExportFunc.sh testExportFunc.sh: line 1: getFile: command not found [root@dns-node2 tmp]# export -f getFile [root@dns-node2 tmp]# sh testExportFunc.sh DaoJiShi.sh debugsh.sh testExportFunc.sh testFunc.sh testSet.sh
读取 $? 得到返回值,若是命令成功退出,那么退出状态为0,不然为非0。
在脚本中,命令行参数能够依据其在命令行中的位置来访问。第一个参数是 $1 ,第二个参数
是 $2 ,以此类推。
下面的语句能够显示出前3个命令行参数:
echo $1 $2 $3
更为常见的处理方式是迭代全部的命令行参数。 shift 命令能够将参数依次向左移动一个位
置,让脚本可以使用 $1 来访问到每个参数。下面的代码显示出了全部的命令行参数:
$ cat showArgs.sh for i in `seq 1 $#` do echo $i is $1 shift done $ sh showArgs.sh a b c 1 is a 2 is b 3 is c