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. "$@" 被扩展成 "$1" "$2" "$3" 等。
  2. "$*" 被扩展成 "$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

猜你喜欢

转载自www.cnblogs.com/liaojiafa/p/11530934.html