1 Shell 函数
shell一个非常重要的特性是它可作为一种编程语言来使用。因为shell是一个解释器,所以它不能对为它编写的程序进行编译,而是在每次从磁盘加载这些程序时对它们进行解释。而程序的加载和解释都是非常耗时的。
针对此问题,许多shell(如BourneAgainShell)都包含shell函数,shell把这些函数放在内存中,这样每次需要执行它们时就不必再从磁盘读入。shell还以一种内部格式来存放这些函数,这样就不必耗费大量的时间来解释它们。
函数的作用就是把程序里多次调用相同代码的部分定义成一份,然后起个名字,所有的调用都 只用这名字就可以了,修改代码时,只需要改变函数体内的代码即可。
1.1、函数的优势
🐟 把相同的程序段定义成函数,可以减少代码量。
🐟 增加程序的可读、易读性
🐟 实现程序功能的模块化
1.2、定义函数
1 2 3 4 5 6 7 8
| function clsn(){ echo "http://blog.znix.top" }
znix(){ echo "http://www.znix.top " }
|
说明:
可以带 function clsn()
定义,也可以直接 clsn()
定义,不带任何参数。
参数返回,可以显示加:return
返回,如果不加,将以最后一条命令运行结果,作为返回值。 return 后跟数值n(0-255)
执行函数就是将函数名放到定义的函数之后即可
将函数加载到当前窗口执行:
1 2 3 4 5 6 7
| [lepeng@centos ~] [lepeng@centos ~] znew znix [lepeng@centos ~] test [lepeng@centos ~] http://blog.znix.top
|
1.3、引用函数
脚本内容
1 2 3 4 5 6
| [lepeng@centos ~] #!/bin/bash
Fun_File=/server/scripts/function/fun1.sh [ -f $Fun_File ] && . $Fun_File clsn
|
脚本执行结果
1 2
| [lepeng@centos ~] http://blog.znix.top
|
1.4、函数传参
脚本内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| [lepeng@centos ~] #!/bin/bash
function clsn(){ echo "Hi " } CLSN(){ echo "Hello " echo $0 echo $1 echo $2 } clsn CLSN xi xi
|
脚本执行结果
1 2 3 4 5 6
| [lepeng@centos ~] Hi Hello fun3.sh xi xi
|
1.5 $0
永远的脚本名称
1 2 3 4 5 6 7 8 9
| function clsn(){ echo "http://blog.znix.top $1 $2" echo $0 }
znix(){ echo "test" } clsn $1 $2
|
执行结果
1 2 3
| [lepeng@centos ~] http://blog.znix.top fun1.sh
|
1.6、函数中return的用法
脚本内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| [lepeng@centos ~] #!/bin/bash
function clsn(){ echo "Hi " } CLSN(){ echo "Hello " echo $0 echo $1 echo $2 return 4 echo "xxixiixxiix" } clsn CLSN xi xi echo $?
|
脚本执行结果
1 2 3 4 5 6 7
| [lepeng@centos ~]# sh fun3.sh Hi Hello fun3.sh xi xi 4
|
return命令说明:
1 2 3 4 5 6 7 8 9
| return: return [n] 从一个 shell 函数返回。 使一个函数或者被引用的脚本以指定的返回值 N 退出。 如果 N 被省略,则返回状态就是 函数或脚本中的最后一个执行的命令的状态。 退出状态: 返回 N,或者如果 shell 不在执行一个函数或引用脚本时,失败。
|
1.7、自定义常用函数库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| #!/bin/bash
function scripts_init(){ prog=`basename $0 .sh` LockFile=/var/lock/subsys/${prog}.lock LogFile=/var/log/${prog}.log PidFile=/var/run/${prog}.pid [ -f $LockFile ] && echo "There $LockFile is exist!!" && exit 1 ||touch $LockFile [ ! -f $LogFile ] && touch $LogFile [ -f $PidFile ] && echo "There $PidFile is exist!!" && exit 2|| echo $$ > $PidFile }
function writelog(){ Date=$(date "+%F_%T") ShellName=`basename $0` Info=$1 echo "$Date : ${ShellName} : ${Info}" >> ${LogFile} }
function closeout(){ [ -f $LockFile ] && rm -f $LockFile [ -f $PidFile ]&& rm -f $PidFile }
function int_judge(){ fun_a=$1 expr $fun_a + 1 &>/dev/null RETVAL=$? return $RETVAL }
function input_judge(){ RETVAL=0 fun_a=$1 [ ${#fun_a} -eq 0 ]&& RETVAL=1 return $RETVAL }
|
$$ 参数:取出脚本运行时的pid, 脚本运行的当前进程ID号
1 2 3 4 5 6
| [lepeng@centos ~] 37208 [lepeng@centos ~] root 37208 37206 0 08:39 pts/0 00:00:00 -bash root 38578 37208 1 10:33 pts/0 00:00:00 ps -ef root 38579 37208 0 10:33 pts/0 00:00:00 grep --color=auto 37208
|
引用自定义函数库示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| [lepeng@centos ~] #!/bin/bash
. /server/scripts/userfun.sh scripts_init i=1 while ((i<=10)) do uptime ((i++)) sleep 1 done closeout
|