shell 编程 08 -- shell函数的知识与实践
作者:moox- 更多信息...
本文为学习使用,请多多指教:https://www.cnblogs.com/moox/p/12850211.html
shell编程-8-shell函数的知识与实践
8.1 函数的概念与作用介绍
简单地说,函数的作用就是将程序里多次被调用的相同代码组合起来(函数体),并为其取一个名字(即函数名),其他所有想重复调用这部分代码的地方都只需要调用这个名字就可以了。当需要修改这部分重复代码时,只需要改变函数体内的一份代码即可实现对所有调用的修改,也可以把函数独立地写到文件里,当需要调用函数时,再加载进来使用。
使用Shell函数的优势整理如下:
- 把相同的程序段定义成函数,可以减少整个程序的代码量,提升开发效率。
- 增加程序的可读性、易读性,提升管理效率。
- 可以实现程序功能模块化,使得程序具备通用性(可移植性)。
对于Shell来说,Linux系统里的近2000个命令可以说都是Shell的函数,所以, Shell的函数也是很多的。
8.2 shell函数的语法
Shell函数的常见语法格式。
标准写法(推荐使用):
复制function 函数名(){
指令
return n
}
简化写法1(带function):
function 函数名{
指令
return n
}
## 在Shell函数的语法中,当有function时,函数名后面的小括号“()”部分可以省略不写。
简化写法2:(不带function):
函数名(){
指令
retturn n
}
## 在Shell函数的语法中,function表示声明一个函数,这部分可以省略不写。
8.3 shell函数的执行
Shell的函数分为最基本的函数和可以传参的函数两种,其执行方式分别说明如下。
1)执行不带参数的函数时,直接输入函数名即可(注意不带小括号)。格式如下:
函数名
有关执行函数的重要说明:
- 执行Shell函数时,函数名前的function和函数后的小括号都不要带。
- 函数的定义必须在要执行的程序前面定义或加载。
- Shell执行系统中各种程序的执行顺序为:系统别名→函数→系统命令→可执行文件。
- 函数执行时,会和调用它的脚本共用变量,也可以为函数设定局部变量及特殊位置参数。
- 在Shell函数里面,return命令的功能与exit类似,return的作用是退出函数,而exit是退出脚本文件
- return语句会返回一个退出值(即返回值)给调用函数的当前程序,而exit会返回一个退出值(即返回值)给执行程序的当前Shell。
- 如果将函数存放在独立的文件中,被脚本加载使用时,需要使用source或“. ”来加载。
- 在函数内一般使用local定义局部变量,这些变量离开函数后就会消失。
2)带参数的函数执行方法,格式如下:
函数名 参数1 参数2
函数后接参数的说明:
- Shell的位置参数($1、#、?及$@)都可以作为函数的参数来使用。
- 此时父脚本的参数临时地被函数参数所掩盖或隐藏。
- $0比较特殊,它仍然是父脚本的名称。
- 当函数执行完成时,原来的命令行脚本的参数即可恢复。
- 函数的参数变量是在函数体里面定义的。
8.4 shell函数的基础实践
范例1、开发脚本建立两个简单函数并调用执行。先定义,后调用
[root@zabbix 0507]# cat shell_1.sh
#!/bin/bash
## 函数定义
function oldboy(){
echo "I am oldboy."
}
function oldgirl(){
echo "I am oldgirl."
}
## 函数调用
oldboy
oldgirl
-------------------------------------
[root@zabbix 0507]# sh shell_1.sh
I am oldboy.
I am oldgirl.
范例2、分离函数体和执行函数的脚本文件(更规范的方法)
首先建立函数库脚本(默认不会执行函数)。
使用cat命令追加多行文本,以将函数代码追加到系统的函数文件中,即/etc/init.d/functions
注意自定义函数放在/etc/init.d/functions的位置必须在return 0 的上面,否则不会生效
命令如下:
[root@zabbix 0507]# cat shell_2.sh
cat >> /etc/init.d/functions <<- zfd ## 此法允许后面的zfd可以tabzfd,而不用顶格
oldboy(){
echo "I am oldboy."
}
zfd ## 此处可以不用顶格,但必须时tab
## 自定义函数放在/etc/init.d/functions的位置必须在return 0 的上面,否则不会生效
------------------------------------------------
[root@zabbix 0507]# sh shell_2.sh
# 追加的函数代码如下
[root@zabbix 0507]# tail -4 /etc/init.d/functions
oldboy(){
echo "I am oldboy."
}
return 0
[root@zabbix 0507]#
然后开发执行脚本以调用上述函数
[root@zabbix 0507]# cat shell_3.sh
#!/bin/bash
[ -f /etc/init.d/functions ]&& . /etc/init.d/functions || exit 1
oldboy
[root@zabbix 0507]# sh shell_3.sh
I am oldboy.
---------------------------------------
[root@zabbix 0508]# cat fun1.sh
#!/bin/bash
. /etc/init.d/functions -- 先引用
oldboy(){
echo "I am oldboy."
}
oldboy
oldgirl -- 再调用
8.5 shell函数实现URL检测和变量颜色显示
8.5.1 shell函数开发URL检测脚本
范例8-5:将函数的传参转换成脚本文件命令行传参,判断任意指定的URL是否存在异常。此题结合了前面章节的检查网站URL的案例,并涉及当下的函数传参及脚本传参。
实现 脚本:传参方式
#!/bin/bash
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
## 提示函数
usage(){
echo "USAGE: $0 url"
exit 1
}
## 检查函数
RETVAL=0
checkUrl(){
wget -T 10 --spider -t 2 &>/dev/null ## -T:获取时间为10s,-t:获取次数为2次
RETVAL=$?
if [ $RETVAL -eq 0 ];then
action "$1 url" /bin/true
else
action "$1 url" /bin/false
fi
return $RETVAL
}
## 主函数
main(){
[ $# -ne 1 ] && usage
CheckUrl $1
RETVAL=$?
return $RETVAL
}
## 调用主函数
main $*
-------------------------------------
[root@zabbix 0508]# sh check_url.sh www.baidu.com
www.baidu.com url [ OK ]
[root@zabbix 0508]#
8.5.2 shell函数if实现输出变量颜色显示
脚本如下:
#!/bin/bash
RED_COLOR='\E[1;31m'
GREEN_COLOR='\E[1;32m'
YELLOW_COLOR='\E[1;33m'
BLUE_COLOR='\E[1;34m'
PINK_COLOR='\E[1;35m'
RES='\E[0m'
usage(){
echo "UASGE: $0 {red|green|yellow|blue|pink}" contents
exit 1
}
color(){
if [ "$1" = "red" ];then
echo -e "$RED_COLOR $2 $RES"
elif [ "$1" = "green" ];then
echo -e "$GREEN_COLOR $2 $RES"
elif [ "$1" = "yellow" ];then
echo -e "$YELLOW_COLOR $2 $RES"
elif [ "$1" = "blue" ];then
echo -e "$BLUE_COLOR $2 $RES"
elif [ "$1" = "pink" ];then
echo -e "$PINK_COLOR $2 $RES"
else
usage
fi
}
main(){
if [ $# -ne 2 ];then
usage
fi
color $1 $2
}
main $*
待补充
8.6 shell函数开发一键优化系统脚本
8.7 shell函数开发rsync服务启动脚本
扩展了解:入职前叮嘱
初入运维职场的老男孩教育学员必须坚守的素质和态度!
作者:moox
出处:http://www.cnblogs.com/moox/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
· 分享一个我遇到过的“量子力学”级别的BUG。
· Linux系列:如何调试 malloc 的底层源码
· 对象命名为何需要避免'-er'和'-or'后缀
· JDK 24 发布,新特性解读!
· C# 中比较实用的关键字,基础高频面试题!
· .NET 10 Preview 2 增强了 Blazor 和.NET MAUI
· SQL Server如何跟踪自动统计信息更新?