函数:一段代码的集合。
Linux系统shell编程中也是有函数这个概念的。这个东西我们也就很熟悉了。在我接触的其他编程语言中,都是有函数这个概念的,就是有些语言中的叫法不同,有的叫函数,有的叫方法。
一:系统函数:
Shell编程中为我们定义了很多系统函数。所谓的系统为我们定义的系统函数,其实就是我们之前学到的系统命令。比如:date,basename,dirname
1:date
这里首先使用date命令做一下测试,也很简单,正常我们的服务器日志要求是一天生成一个文件。这就涉及到命名的问题,这里使用date就很合适。
编辑 she.sh文件
复制代码
vim she.sh
在文件中键入以下内容:
bash
复制代码
#! /bin/bash filename="$1"_log_$(date +%s) echo $filename
执行文件she.sh
bash
复制代码
[root@VM_0_4_centos test]# ./she.sh admin admin_log_1669171427
2:basename
这个命令就比较有意思了,他会删掉所有的前缀包括最后一个(/)字符,然后将字符串显示出来。
Basename命令可以理解成获取路径中的文件名称,说的再直白点就是获取截取字符串中的最后一个,无论这个文件是否存在。
接下来,我们测试一下:
csharp
复制代码
# /etc/nginx/nginx.conf 这个文件是真实存在的 [root@VM_0_4_centos test]# basename /etc/nginx/nginx.conf nginx.conf # /etc/nginx/nginx.conf 这个文件是不存在的 [root@VM_0_4_centos test]# basename /etc/nginx/default.conf default.conf
通过上方的代码我们大概可以证明,basename只是截取字符串。获取文件名。
3:dirname
这个命令更有意思,和上方我们看的basename是一套,basename是获取文件名,dirname是获取文件路径。官方给他的定义是:从给定的包含绝对路径的文件名中取出文件名,返回剩下的路径。说白了,还是截取字符串。
接下来,我们测试一下:
bash
复制代码
# 文件真实存在,绝对路径 [root@VM_0_4_centos test]# dirname /etc/nginx/nginx.conf /etc/nginx # 文件不存在 ,绝对路径 [root@VM_0_4_centos test]# dirname /etc/nginxsssssss/nginx.conf /etc/nginxsssssss # 文件不存在,相对路径 [root@VM_0_4_centos test]# dirname ./etc/nginxsssssss/nginx.conf ./etc/nginxsssssss [root@VM_0_4_centos test]#
二:自定义函数:
自定义函数分两部分来介绍:
基本语法:
ini
复制代码
[ function ] funname [()] { action; [return int;] }
1:无参数函数:
复制代码
vim she.sh
在she.sh文件中键入以下内容:
bash
复制代码
#! /bin/bash testFunction(){ echo "这是我的第一个shell函数" } echo "函数开始调用" testFunction echo "函数结束调用"
调用执行she.sh文件:
bash
复制代码
[root@VM_0_4_centos test]# ./she.sh 函数开始调用 这是我的第一个shell函数 函数结束调用
配合我们之前的read读取控制台命令来使用一下:
在she.sh中键入以下内容:
bash
复制代码
#! /bin/bash testFunction(){ echo "请输入第一个数字:" read numberOne echo "请输入第二个数字:" read numberTwo return $(($numberOne + $numberTwo)) } echo "函数开始调用" testFunction echo $? echo "函数结束调用"
调用she.sh文件:
bash
复制代码
[root@VM_0_4_centos test]# ./she.sh 函数开始调用 请输入第一个数字: 2 请输入第二个数字: 2 4 函数结束调用
以上大概就是无参数函数的基本使用。
2:有参数函数:
这个位置要着重的说一下,shell中的函数并不需要在函数体的括号内输入形参,使用我们之前介绍过得$n即可。
这里再重点说一下n的用法:n的用法:n的用法:1表示第一个参数,2表示第二个参数...2表示第二个参数... 2表示第二个参数...10 不能获取第十个参数,获取第十个参数需要10。当n>=10时,需要使用{10}。当n>=10时,需要使用10。当n>=10时,需要使用{n}来获取参数。$0是文件本身的名字,函数调用传递参数使用空格隔开即可。
测试一下:
在she.sh中键入以下内容:
bash
复制代码
#! /bin/bash isFunction(){ echo "文件名称是:"$0 echo "第一个参数是:"$1 echo "第十个参数是:"$10 echo "第十个参数是:${10}" } echo "函数开始调用" isFunction 1 2 3 4 5 6 7 8 9 10 echo "函数结束调用"
执行she.sh文件:
bash
复制代码
[root@VM_0_4_centos test]# ./she.sh 函数开始调用 文件名称是:./she.sh 第一个参数是:1 第十个参数是:10 第十个参数是:10 函数结束调用
另外,还有几个特殊字符用来处理参数:
参数处理 | 说明 |
$# | 传递到脚本或函数的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
以上大概就是shell函数的基本使用。
有好的建议,请在下方输入你的评论。