shell基础知识5-函数
函数的定义
function fname(){
}
或者
function_name(){
}
对于简单的函数,甚至可以是这样做 fname() { statement; }
函数调用
直接写函数名即可。如 fname
传参给函数
传入的参数都是位置参数,无法传入形式参数以及设置默认参数,传入位置的参数如下:
fname arg1 arg2
简单的函数例子如下:
fname(){
echo $1, $2; #访问参数1和参数2
echo "$@"; #以列表的方式一次性打印所有参数
echo "$*"; #类似于$@,但是所有参数被视为单个实体
return 0; #返回值
}
fname a b
解释下不常见的参数:
- "$@" 被扩展成 "$1" "$2" "$3" 等。
- "$*" 被扩展成 "$1c$2c$3" ,其中 c 是IFS的第一个字符。
IFS解释:
IFS是shell脚本中的一个重要概念,在处理文本数据时,它是相当有用的。IFS可以是White Space(空白键)、Tab( 表格键)、Enter( 回车键)中的一个或几个。
IFS(Internal Field Seperator)在Linux的shell中预设的分隔符,用来把command line分解成word(字段)。
IFS的设置方法很简单,和普通变量设置方法类似:
IFS=":"
建议设置IFS前保存原IFS的值,在使用后及时恢复。
别名的位置参数
通过设置别名的方法设置一个命令,然后传入参数进去看看有什么效果
[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