高新区免费网站建设,商丘网格通,seo专业培训班,王业美三个字组成的子函数的作用就是将程序里多次被调用的相同代码组合起来#xff08;函数体#xff09;#xff0c;并为其取一个名字#xff0c;即函数名。其他所有想重复调用这部分代码的地方都只需要调用这个名字就可以了。当需要修改这部分代码时候#xff0c;只需要修改函数体内的这部分…
函数的作用就是将程序里多次被调用的相同代码组合起来函数体并为其取一个名字即函数名。其他所有想重复调用这部分代码的地方都只需要调用这个名字就可以了。当需要修改这部分代码时候只需要修改函数体内的这部分代码即可实现对所有调用的修改也可以把函数独立地写在文件里当需要调用函数时再加载进来使用。 好处
1把相同的程序段定义成函数可以减少程序代码量
2增加程序的可读性易读性
3呈现程序的功能模块化使得程序具备通用性可移植性。 语法
function 函数名() {指令...return n
}函数名() {指令...return n
}
执行
1执行不带参数的函数直接输入函数名即可。
2执行带参数的函数
函数名 参数1 参数2
3函数的执行必须要在执行的程序前面定义和加载。
4Shell执行系统中各种程序的执行顺序系统别名-》函数-》系统命令-》可执行文件。
5函数执行的时候会和调用它的脚本公用变量也可以为函数设定局部变量及特殊位置参数。
6函数体中的return语句会返回一个退出值返回值给调用函数的当前程序。
7如果将函数存放在一个独立的文件中被脚本加载使用的时候需要使用source或者点号来加载。
8在函数内一般使用local定义局部变量这些变量离开函数后就会消失。
9Shell的位置参数($1/$2/$#/$*/$?/$)都可以作为函数的参数来使用。
10此时的父脚本的参数临时地被函数参数所掩盖或者隐藏。
11$0 比较特殊他仍然是父脚本的名称。
12当函数执行完成时原来的命令行脚本的参数即可恢复。
13函数的参数变量是在函数体里面定义的。 示例1
[rootvm1 scripts]# cat function01.sh
#!/bin/bashchang(){echo I am chang.
}chun() {echo I am chun.
}chang # 调用chang
chun #调用chun
[rootvm1 scripts]# sh function01.sh
I am chang.
I am chun. 示例2
分离函数体和执行函数的脚本文件更规范的方法
首先是建立函数体脚本默认不会执行函数。
使用cat命令追加多行脚本以将函数代码追加到系统的函数文件中即/etc/init.d/functions。 注意的是要将定义的函数放在return 0的上面。如果放在return 0语句的下面将无法调用到oldboy函数。在/etc/init.d/functions系统函数文件中添加的函数将不起作用。
然后在编辑脚本
[rootvm1 scripts]# cat function02.sh
#!/bin/bash
#
[ -f /etc/init.d/functions ] . /etc/init.d/functions || exit 1oldboy
[rootvm1 scripts]# sh function02.sh
I am oldboy程序和函数分离的常见方法
[rootvm1 scripts]# cat fun02.sh
#!/bin/bash# 在函数文件中只定义函数
# 可以在该函数文件中定义更多的函数
fun_01(){echo I am oldboy linux.
}[rootvm1 scripts]# cat exec01.sh
#!/bin/bash
#
[ -f fun02.sh ] . ./fun02.sh || exit 1# 执行函数
fun_01[rootvm1 scripts]# sh exec01.sh
I am oldboy linux.说明
1在函数文件中可以定义多个函数。
2我们可以创建单独的函数文件然后加载这个函数文件而不需要使用系统的函数文件/etc/init.d/functions。
3这是一个比较规范的方法。 示例3带参数的shell函数。
[rootvm1 scripts]# cat fun02.sh
#!/bin/bash# 在函数文件中只定义函数
# 可以在该函数文件中定义更多的函数
fun_01(){echo I am oldboy linux.
}# 带参数的函数
fun_02(){echo I am $1
}[rootvm1 scripts]# cat exec01.sh
#!/bin/bash
#
[ -f fun02.sh ] . ./fun02.sh || exit 1# 执行带参数的函数这个$1本身是脚本的位置参数但是$1占据的位置为函数的参数位置现在它们重合了。
fun_02 $1# 将changchunhua作为参数
[rootvm1 scripts]# sh exec01.sh changchunhua
I am changchunhua说明
此时的父脚本的参数临时地被函数参数所掩盖或者隐藏。 案例利用shell函数开发企业级URL检测脚本
[rootvm1 scripts]# cat url_check.sh
#!/bin/bashif [ $# -ne 1 ]thenecho USAGE: $0 URLexit 1
fiwget --spider --timeout 10 --tries2 $1 /dev/nullif [ $? -eq 0 ]thenecho $1 is yes.
elseecho $1 is no.
fi测试结果
[rootvm1 scripts]# sh url_check.sh www.baidu.com
www.baidu.com is yes.[rootvm1 scripts]# sh url_check.sh jd.com
jd.com is yes.
然后我们再进行一次升级
将检测的功能写成函数并将函数传参转换成脚本命令行传参判断任意指定的url是否存在异常。
[rootvm1 scripts]# cat url_check2.sh
#!/bin/bash# 帮助函数
function usage(){echo USAGE: $0 urlexit 1
}# 检测URL函数
function check_url(){wget --spider --timeout 10 --tries2 $1 /dev/nullif [ $? -eq 0 ]thenecho $1 is yes.elseecho $1 is no.fi
}# 主函数
function main(){if [ $# -ne 1 ] # 如果传入的是多个参数则打印帮助函数提示用户。thenusageficheck_url $1
}main $* # 这里的$*就是把命令行接受的所有参数作为函数参数传给函数的内部是一种常用的手法学习了函数以后尽量将脚本功能模块化每个模块实现一个功能并且让脚本可以通用。
工作中使用的一些Shell脚本有时间也是需要进行升级修改将脚本功能模块化。 然后我们使用更加专业的显示输出
[rootvm1 scripts]# cat url_check3.sh
#!/bin/bash[ -f /etc/init.d/functions ] . /etc/init.d/functions || exit 1# 帮助函数
function usage(){echo USAGE: $0 urlexit 1
}# 检测URL函数
function check_url(){wget --spider --timeout 10 --tries2 $1 /dev/nullif [ $? -eq 0 ]then# echo $1 is yes.action $1 is yes. /bin/trueelse# echo $1 is no.action $1 is no. /bin/truefi
}function main(){if [ $# -ne 1 ]thenusageficheck_url $1
}main $* # 这里的$*就是把命令行接受的所有参数作为函数参数传给函数的内部是一种常用的手法执行结果
[rootvm1 scripts]# sh url_check3.sh jd.com
jd.com is yes. [ OK ]