函数

2020-12-29  本文已影响0人  慕知

一, 函数介绍

1,函数定义

  1. 具备某一功能的工具 --> 函数
  2. 事先准备工具的过程 --> 定义函数
  3. 遇到应用场景拿过来用 --> 调用函数

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
上一篇下一篇

猜你喜欢

热点阅读