返回顶部

zhangfd

个人博客,仅供学习使用

导航

shell 编程 08 -- shell函数的知识与实践

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、\(2…、\)#、\(*、\)?及$@)都可以作为函数的参数来使用。
  • 此时父脚本的参数临时地被函数参数所掩盖或隐藏。
  • $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服务启动脚本

扩展了解:入职前叮嘱

初入运维职场的老男孩教育学员必须坚守的素质和态度!

https://blog.51cto.com/oldboy/1706490

posted on 2020-05-08 14:15  zhangfd  阅读(321)  评论(0编辑  收藏  举报