函数
2020-12-29 本文已影响0人
慕知
一, 函数介绍
1,函数定义
- 具备某一功能的工具 --> 函数
- 事先准备工具的过程 --> 定义函数
- 遇到应用场景拿过来用 --> 调用函数
2, 函数的作用
没有使用函数写脚本时,遇到重复的代码,只能复制粘贴,啰嗦麻烦问题有:
1,代码可读性差
2,可维护性,扩展性差
3,如何使用函数
原则:先定义,后调用
二,函数的基本使用
1, 定义函数的三种格式:
格式一(建议使用):
function f1() {
代码1
代码2
代码3
}
格式二
function f1 {
代码1
代码2
代码3
}
格式三
f1() {
代码1
代码2
代码3
}
示例:
[root@m01~]# vim /script/function.sh
#!/bin/bash
function f1() {
echo "第一行...."
}
function f2 {
echo "第二行..."
}
f3() {
echo "第三行..."
}
f1
f2
f3
[root@m01~]# /script/function.sh
第一行....
第二行...
第三行...
2, 函数的调用:
f1 #无参调用
f1 111 222 333 444 #有参调用
1)
[root@m01~]# vim /script/function1.sh
#!/bin/bash
function f1() {
echo $1
echo $2
echo $3
echo $*
echo $@
}
f1 11 22 33 44 55
[root@m01~]# /script/function1.sh
11
22
33
11 22 33 44 55
11 22 33 44 55
2)
[root@m01~]# vim /script/function1.sh
#!/bin/bash
function f1() {
echo $1
echo $2
echo $3
echo $*
echo $@
}
function f2() {
expr $1 + $2
}
f2 19 1
f2 12 8
[root@m01~]# /script/function1.sh
20
20
三,函数参数
- 函数体代码 -----> 工厂内的流水线
- 函数的参数 -----> 为工厂运送的原材料
- 函数的返回值 -----> 流水线加工的产品
四,函数的返回值
return ----》函数内可以有多个return值,只要执行一个整个函数会立刻结束,return的值作为调用的值返回
[root@m01~]# vim /script/return1.sh
#!/bin/bash
function f1(){
echo 1111111
return
echo 222222
return
echo 3333
}
f1
[root@m01~]# chmod +x /script/return1.sh
[root@m01~]# /script/return1.sh
1111111
return后加上整型数 0-255
示例一:
[root@m01~]# vim /script/return1.sh
#!/bin/bash
function f1(){
echo 1111111
return 0
echo 222222
return
echo 3333
}
f1
echo $?
返回值为0代表函数执行成功
[root@m01~]# /script/return1.sh
1111111
0
示例二:(函数内没有return值,返回值以最后一条为准)
#!/bin/bash
function f1(){
echo 1111111
echo 222222
shduecho 3333
}
f1
echo $?
[root@stars ~]# ./cc.sh
1111111
222222
./cc.sh: line 6: shduecho: command not found
127
示例三:
#!/bin/bash
function f1(){
jdfhjecho 1111111
echo 222222
echo 3333
}
f1
echo $?
[root@stars ~]# ./cc.sh
./cc.sh: line 4: jdfhjecho: command not found
222222
3333
0
# 函数内虽有报错,最后一条echo 3333可以输出,则返回值是0
五,作用域
1,局部作用域
局部作用域,函数外的值是调用不到函数里的值4
[root@m01~]# vim /script/return2.sh
#!/bin/bash
function ab(){
local x=1
echo "函数内的值为:$x"
}
ab
echo "函数外的值为:$x"
[root@m01~]# /script/return2.sh
函数内的值为:1
函数外的值为:
2,全局作用域
一定要加上local, 否则视为全局
示例一
#!/bin/bash
z=2
echo $z
function ab(){
echo "函数内的值为:$z"
}
#ab
#echo "函数外的值为:$z"
[root@m01~]# /script/return2.sh
函数内的值为:2
函数外的值为:2
[root@m01~]# /script/return2.sh
2
[root@m01~]# echo $z
直接$z得不出结果,因为脚本是在子bash进程中,
[root@m01~]# echo $z 是在父bash进程
用source执行或者. 空格,是在父bash重新执行,这样$z也有结果
[root@m01~]# . /script/return2.sh
2
[root@m01~]# echo $z
2
这种情况下,可以另外写一个脚本,父bash执行脚本也可以调用值
[root@m01~]# vim z.sh
#!/bin/bash
echo $z
[root@m01~]# chmod +x z.sh
[root@m01~]# . z.sh
2
示例二
#!/bin/bash
z=1
function ab(){
local z=2
echo "函数内的值为:$z"
}
ab
echo "函数外的值为:$z"
[root@m01~]# /script/return2.sh
函数内的值为:2
函数外的值为:1
示例三
#函数外调用函数外的变量
#!/bin/bash
z=2
function ab(){
z=111
echo "函数内的值为:$z"
}
echo "函数外的值为:$z"
[root@m01~]# /script/return2.sh
函数外的值为:2
#调用函数在前,再取变量值
#!/bin/bash
z=2
function ab(){
z=111
echo "函数内的值为:$z"
}
ab
echo "函数外的值为:$z"
[root@m01~]# /script/return2.sh
函数内的值为:111
函数外的值为:111
#取变量值在前,再调用函数
[root@m01~]# vim /script/return2.sh
#!/bin/bash
z=2
function ab(){
z=111
echo "函数内的值为:$z"
}
echo "函数外的值为:$z"
ab
[root@m01~]# /script/return2.sh
函数外的值为:2
函数内的值为:111
补充
#在父bash里设置变量,再开一个子bash,就无法识别变量
exit退出,即可再次识别
[root@m01~]# a=11111
[root@m01~]# echo $a
11111
[root@m01~]# bash
[root@m01~]# echo $a
[root@m01~]# exit
[root@m01~]# echo $a
11111
# 使用export 就可以开启多个bash也可以识别变量
[root@m01~]# w=5
[root@m01~]# export w
[root@m01~]# echo $w
5
[root@m01~]# bash
[root@m01~]# echo $w
5
#如上虽然可以在多个子进程里也可以使用,重新打开一个终端也不能使用
[root@m01~]# vim /etc/profile
export w=5
#再次打开个终端测试:
root@10.0.0.61's password:
Last login: Sun Dec 27 12:22:00 2020 from 10.0.0.1
[root@m01~]# echo $w
5