shell-函数基础

函数定义

通俗的讲函数就是一团集中的代码,形成一个代码块,这个代码块可以实现某个具体的功能。本质上来讲,函数是函数名到某个代码块的映射。也就是说,用户定义函数后,就可以通过函数名来调用其对应的代码块

从形式上来看,shell函数和shell脚本并没有什么区别,都是一些命令的堆叠。

但是shell脚本执行的时候操作系统会为其创建一个新的进程,解释代码。执行完成后,该进程自动关闭
调用函数时,操作系统并不会为其单独创建进程,而是在调用者的shell进程中直接解释执行函数中的代码

shell函数的定义语法

funtion_name ()
{
statement1
statement2
.....
statementn
}

或者是

function function_name ()
{
statement
statement2
......
}

举个简单的例子,定义函数分别用两种写法定义hello

#!/bin/bash
#this is a script to test the function

function hello1 ()
{
        echo "This is the first function! "
}
hello1
echo
hello2 ()
{
        echo "This is the second function! "
}
hello2
    

输出结果为

函数调用

事实上函数的调用和变量的调用类似,预先定义好函数体,然后通过函数名来调用定义好的函数体。调用的方法为:
function_name param1 param2 param3....
其中function_name是函数名(调用时不加括号),param为函数的参数
写一个简单的查看cpu信息和系统负载的函数,将信息保存在当前目录下命名为 cpuinfo_and_system_load.txt,然后通过cat查看

#!/bin/bash
#View the CPU information and system load
func ()
{
        cpu_info=` cat /proc/cpuinfo `
        system_load=`w`
        echo "$cpu_info"
        echo
        echo "$system_load"


}
func >cpuinfo_systemload.txt
cat cpuinfo_systemload.txt

输出结果为

函数链接

所谓链接就是,在一个函数中调用另一个函数的过程,即俄罗斯套娃大法。因为定义一个函数之后在该shell中,此函数就是一个合法的shell命令,可以在后续的脚本中使用。
定义康康和李梅,在李梅中调用康康的变量名,然后调用李梅输出结果。

#!/bin/bash
kangkang ()
{
        echo "I LOVE YOU"
}

limei ()
{
        echo "kangkang say `kangkang` me too"
}
limei

输出结果:

函数的返回值

返回值,顾名思义就是函数根据用户输入的参数,执行脚本计算后,返回给用户的值。
例如输入a和b两个值,计算乘积,将结果$c作为返回值返回给用户,使用echo $?查看返回值:

#!/bin/bash
func ()
{
read a b
let "c = $a * $b"
return $c
}
func
echo $?

输出结果

可以看到但返回值小于255时都是正常的,但是在150乘2时返回的结果却为44,因为return只能返回0~255之间的整数值,不在这个范围之内就会返回错误的结果
事实上要获得返回值,使用最多的是“echo”命令,echo没有0~255的限制,可以将各种数据写入标准输出,因此更加强大。

#!/bin/bash
func ()
{
echo "请输入两个值,中间以空格隔开,计算它们的乘积"
read a b
let "c = $a * $b"
echo ”乘积为 $c“
}
func

输出为

函数和别名

我们可以通过alias把一个常用的并且很长的指令别名一个简洁易记的指令。如果不想用了,还可以用unalias解除别名功能。直接敲alias会看到目前系统预设的alias.

一个简单的别名演示

全局变量和局部变量

默认情况下,除了与函数参数相关联的特殊变量之外,其他的所有变量都是全局变量。即使在函数内部,除了带有local关键字进行修饰的变量,一律为全局变量。

#!/bin/bash
var=123     
func ()
{
        echo $var      //此处的全局变量为var=123
        var=321
        echo $var      //此处的全局变量为321     
        local var=12423445      //此处为局部变量
        echo $var      //$var的值应该是12423445这个局部变量
}
echo $var      //因为尚未调用函数,所以$var的值为123
func
echo $var      //函数内最后一次对$var的全局变量的声明为321,局部变量12423445的范围仅限于函数内部

据分析,结果应该是:

123
123
321
12423445
321

果不其然,结果是

posted @ 2020-06-02 22:31  徐野子  阅读(343)  评论(0编辑  收藏  举报