函数可以让我们将一个复杂功能划分成若干模块,让程序结构更加清晰,代码重复利用率更高。像其他编程语言一样,shell也支持函数。shell函数必须先定义后使用
function_name(){ list of commands [ return value ] }
如果你愿意,也可以在函数名前加上关键字function:
function function_name() { list of commands [ return value ] }
函数返回值,可以显式地增加return语句;如果不加,会将最后一条命令运行结果作为返回值。 Shell函数返回值只能是整数,一般用来表示函数执行成功与否,0表示成功,其他表示失败。如果return其他数据,比如一个字符串,往往会得到错误提示:“numeric argument required”。 如果一定要让函数返回字符串,那么可以先定义一个变量,用来接收函数的计算结果,脚本在需要的时候访问这个变量来获得函数返回值。
调用函数只需要给出函数名,不需要加括号 一个带有return语句的函数:
#!/bin/bash funWithReturn(){ echo "The function is to get the sum of two numbers..." echo -n "Input first number:" read aNum echo -n "Input another number:" read anotherNum echo "The two numbers are $aNum and $anotherNum!" return $(($aNum + $anotherNum)) } funWithReturn ret=$? echo "The sum of two numbers is $ret!"
函数返回值在调用该函数后通过“$?”来获得。 如果你希望直接从终端调用函数,可以将函数定义在主目录下的.profile文件,这样每次登陆后,在命令提示符后面输入函数名字就可以立即调用。
#!/bin/bash #调用另一个函数 number_one(){ echo "hello 1" number_two } number_two(){ echo "hello 2" } number_one
像删除变量一样,删除函数也可以使用unset命令,不过要加上-f选项,如下所示:
$unset -f function_name
在shell中,调用函数时可以向其传递参数。在函数体内部,通过$n的形式来取参数的值,例如,
{10} 另外还有几个特殊变量用来处理参数,前面已经提到:
特殊变量 说明 $# 传递给函数的参数个数 $* 显示所有传递给函数的参数 $@ 与$*相同,但是略有区别 $? 函数的返回值
#!/bin/bash funWithParam(){ echo "The value of the first parameter is $1 !" echo "The value of the tenth parameter is ${10} !" echo "The amount of the parameters is $# !" #参数个数 echo "The string of the parameters is $* !" #传递给函数的所有参数 } funWithParam 1 2 3 4 5 6 7 8 9 21 32
递归函数就是自己调用自己 递归函数查看/var/log
#!/bin/bash function list_files(){ for f in `ls $1` do #判断是否为目录 if [ -d "$1/$f" ] then echo "$2$f" #递归调用 list_files "$1/$f" " $2" else echo "$2$f" fi done } list_files "/var/log"
[root@localhost ~]# sh digui.sh anaconda anaconda.log ifcfg.log journal.log ks-script-2jWz3Q.log packaging.log program.log storage.log syslog X.log audit audit.log boot.log boot.log-20200615 boot.log-20200616 boot.log-20200714 boot.log-20200717 boot.log-20200719 boot.log-20200721 boot.log-20200722 btmp btmp-20200714 chrony cron cron-20200609 cron-20200614 cron-20200714 cron-20200719 cups access_log access_log-20200609 access_log-20200614 access_log-20200714 access_log-20200719 error_log page_log dmesg dmesg.old firewalld gdm :0-greeter.log :0-greeter.log.1 :0-greeter.log.2 :0-greeter.log.3 :0-greeter.log.4 :0.log :0.log.1 :0.log.2 :0.log.3 :0.log.4 :1-greeter.log :1.log glusterfs grubby_prune_debug httpd access_log access_log-20200719 error_log error_log-20200719 lastlog libvirt qemu maillog maillog-20200609 maillog-20200614 maillog-20200714 maillog-20200719 messages messages-20200609 messages-20200614 messages-20200714 messages-20200719 ntpstats pluto peer ppp qemu-ga rhsm sa sa14 sa15 sa16 sa17 sa19 sa20 sa21 sa22 sa23 sa24 sa25 sar16 sar20 sar21 sar22 sar23 samba old secure secure-20200609 secure-20200614 secure-20200714 secure-20200719 speech-dispatcher spooler spooler-20200609 spooler-20200614 spooler-20200714 spooler-20200719 sssd swtpm libvirt qemu tallylog tuned tuned.log vmware-network.1.log vmware-network.2.log vmware-network.3.log vmware-network.4.log vmware-network.5.log vmware-network.6.log vmware-network.7.log vmware-network.8.log vmware-network.9.log vmware-network.log vmware-vgauthsvc.log.0 vmware-vmsvc.log vmware-vmusr.log wpa_supplicant.log wtmp Xorg.0.log Xorg.0.log.old Xorg.1.log Xorg.9.log yum.log
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
我来说两句