shell函数

  • 2019-12-03
  • 64
  • 0
  • 2

Shell 函数定义

函数是一个脚本代码块,你可以对它进行自定义命名,并且可以在脚本中任意位置使用这个函数,要使用这个函数,只要使用这个函数名称就可以了。使用函数的好处:模块化,代码可读性强。

说明:

  • 1、可以带function fun  定义,也可以直接fun() 定义,不带任何参数。
  • 2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)

注意:函数名的使用,如果在一个脚本中定义了重复的函数名,那么以最后一个为准!

函数创建语法

方法1:

function name {
              commands
}
# 注意:name是函数唯一的名称

方法2:name后面的括号表示你正在定义一个函数

name(){
              commands
}

调用函数语法

函数名 参数1 参数2 …

调用函数时,可以传递参数。在函数中用$1、$2…来引用传递的参数

下面的例子定义了一个函数并进行调用:

例1:

#!/bin/bash
demoFun(){        # 定义函数
    echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun        # 调用函数
demoFun
demoFun
echo "-----函数执行完毕-----"
输出结果:
-----函数开始执行-----
这是我的第一个 shell 函数!
这是我的第一个 shell 函数!
这是我的第一个 shell 函数!
-----函数执行完毕-----

例2:两个数相加

funWithReturn(){
    echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum 和 $anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"
执行输出结果为:
[root@shuai ~]# chmod +x fun.sh 
[root@shuai ~]# ./fun.sh 
这个函数会对输入的连个数字进行相加运算...
输入一个数字:
2
输入第二个数字:
2
两个数字分别为 2 和 2!
输入的两个数字之和为 4 !

返回值

使用return命令来退出函数并返回特定的退出码

注:状态码的确定必需要在函数一结束就运行return返回值;状态码的取值范围(0~255)

#!/bin/bash
function fun1 {
        echo 'this is function'
        ls /etc/passwd
        return 3
}
fun1
# 运行结果
[root@localhost SHELL]# bash fun1.sh 
this is function
/etc/passwd
[root@localhost SHELL]# echo $?
3

exit 数字  和  return 数字 的区别?

exit整个脚本就直接退出,返回数字;  

return:只是在函数最后添加一行,然后返回数字,只能让函数后面的命令不执行,无法强制退出整个脚本的。

[root@localhost SHELL]# vim fun_test.sh
#!/bin/bash
function fun_1 {
        echo "this is function"
        ls /etc/passwd
        return 3
}
fun_1
echo $?
echo aaaaaa
echo $?
[root@localhost SHELL]# bash fun_test.sh 
this is function
/etc/passwd
3        # 函数return返回的值
aaaaaa
0        # echo aaaaaa成功后返回的值

把函数值赋给变量使用

例: 函数名就相当于一个命令

[root@localhost SHELL]# vim fun2.sh 
#!/bin/bash
fun2(){
        read -p "请输入一个数值:" value
        echo $[$value*2]
}
num=$(fun1)
echo "目前的数值是:$num"
# 运行结果
[root@localhost SHELL]# bash fun2.sh 
请输入一个数值:10
目前的数值是:20

函数的参数传递

第一种:通过脚本传递参数给函数中的位置参数$1

[root@localhost SHELL]# vim fun3.sh 
#!/bin/bash
fun3(){
        rm -rf $1
}
fun3 $1
# 运行结果
[root@localhost SHELL]# touch a.txt
[root@localhost SHELL]# chmod +x fun3.sh 
[root@localhost SHELL]# ./fun3.sh a.txt 
[root@localhost SHELL]# ls a.txt
ls: 无法访问a.txt: 没有那个文件或目录

第二种:调用函数时直接传递参数

[root@localhost SHELL]# vim fun3.sh 
#!/bin/bash
fun3(){
        rm -rf $1
}
fun3 /root/SHELL/a.txt
# 运行结果
[root@localhost SHELL]# touch a.txt
[root@localhost SHELL]# ./fun3.sh 
[root@localhost SHELL]# ls a.txt 
ls: 无法访问a.txt: 没有那个文件或目录

第三种:函数中多参数传递和使用方法

[root@localhost SHELL]# vim fun3.sh 
#!/bin/bash
fun3(){
        echo $[$1*5]
        echo $[$2*2]
}
fun3 5 2
# 运行结果
[root@localhost SHELL]# ./fun3.sh 
25
4

函数中变量的处理

Shell 变量的作用域可以分为三种:

  • 有的变量只能在函数内部使用,这叫做局部变量(local variable);
  • 有的变量可以在当前 Shell 进程中使用,这叫做全局变量(global variable);
  • 而有的变量还可以在子进程中使用,这叫做环境变量(environment variable)。

函数使用的变量类型有两种:

  • 全局变量
  • 局部变量

全局变量

全局变量:默认情况下,你在脚本中定义的变量都是全局变量,你在函数外面定义的变量在函数内也可以使用

例:

[root@localhost SHELL]# vim fun4.sh
#!/bin/bash
fun4(){
        num1=$[$var1*2]
}
read -p "请输入一个数值:" var1    # var1是全局变量
fun4
echo "乘2后:$num1"
# 运行结果
[root@localhost SHELL]# bash fun4.sh 
请输入一个数值:2
乘2后:4

局部变量

局部变量:在 Shell 函数中定义的变量默认也是全局变量,它和在函数外部定义变量拥有一样的效果;
在一个函数中将某个变量声明为local,则该变量就是一个局部变量,只在本函数中有效

local:一般用于局部变量声明,多在在函数内部使用

  • shell脚本中定义的变量是global的,其作用域从被定义的地方开始,到shell结束或被显示删除的地方为止。
  • shell函数定义的变量默认是global的,其作用域从“函数被调用时执行变量定义的地方”开始,到shell结束或被显示删除处为止。函数定义的变量可以被显示定义成local的,其作用域局限于函数内。但请注意,函数的参数是local的。
  • 如果同名,Shell函数定义的local变量会屏蔽脚本定义的global变量。

例:

#!/bin/bash
function Hello()
{
        local text="Hello World!!!"     # text是局部变量
        echo $text
}

Hello

评论

还没有任何评论,你来说两句吧

发表评论

:zhenbang: :yiwen: :yinyue: :yinxian: :yi: :xxyl: :xinsui: :xiaonian: :weiqu: :tushe: :tu: :taiyang: :taikaixin: :shuijiao: :shenli: :shengqi: :ruo: :qianbi: :qian: :pen: :neng: :mianqiang: :meigui: :lu: :liwu: :kuanghan: :ku: :kaixin: :jinya: :jiku: :huaxin: :huaji: :hu: :heixian: :hehe: :han: :haha: :haha2: :guai: :dangao: :damuzhi: :daku: :chabei: :caihong: :bugaoxing: :bishi: :aixin: :a: :OK: :) :(