本文旨在复习shell函数作用、定义、嵌套、删除、终端调用、返回值、参数传递

知识储备


  • 函数:即Functions,把一组实现通用功能的独立的代码模块[通常里面是变量,可变的参数组成]封装在一起,并给予命名;后续用到时,可直接通过给定函数名来调用整体代码

  • 函数作用:<1>代码重用 <2>模块化编程

  • 数使用:<1>先定义:编写函数代码 <2>后调用:调用函数,按需传递参数[非必需]

函数定义及调用


函数定义格式主要有2种,如下:

1
2
3
4
5
6
7
8
9
10
11
12


function Fun_Name () {
    函数体
    ...
    [ return value ]
}
#--------------------------->#

Fun_Name () {
    函数体
    ...
    [ 
return value ]
}

    <1>第一种,使用关键字function申明函数名

    <2>第二种,直接用函数名来,本质上没有多大区别,为了可读性,建议采用第一种

调用方式:直接使用函数名,不需要带

1
2
3
4


function sum () {
    echo 
"$[$1+$2]"
}
sum $1 $2


函数嵌套


函数之间可以彼此嵌套,当一个函数依赖于另一个小函数的时候可以这么用,举个例子

实现代码

1
2
3
4
5
6
7
8
9
10
11


#!/bin/bash

function fun1 () {
    echo 
"This is fun1."
}

function fun2 () {
    echo 
"This is fun2."
    fun1 
}
fun2

wKiom1YBO_KT78LgAANEKHa91ds154.bmp


函数删除


变量可以使用unset删除,那么函数也可以删除,不过谁会这么蛋疼?   

1


unset .f function_name


终端调用


如果想在终端使用自己定义的函数,那么可以将函数定义放在.profile这类文件中

当然了profile文件,根据以前所学的知识 

全局profile--->   /etc/profile /etc/profile.d/*.* [这里有众多脚本文件在开机后自执行] 

个人profile ---> ~/.bash_profile

例1:在所有用户定义一个函数sumsum求2个数的合,并且可以在终端直接调用

wKioL1YBPjLjfS_MAAV5-CPHOrg137.bmp

在/etc/profile中定义好函数后,需要重新加载一下profile文件[注销 或 source /etc/profile ]

wKioL1YBPqOS_R9oAAPrWP6OS1c916.bmp


返回值


命令执行结果有2种:执行结果 + 执行状态结果。执行状态结果是0-255的数值,0成功,其他失败。

函数返回值其实就是状态结果,用来表示函数执行成功与否,就是之前说的$?这个特殊变量的值。

用户可以使用[ return value ]自定义函数值

例1:定义一个自定义返回值的函数执行

1
2
3
4
5
6
7


#!/bin/bash

function fun1 () {
    echo 
"This is fun1."
    
return 188
}
fun1

wKioL1YBQEPSakVUAAP6KJdDdnE724.bmp

注意点:

  <1>函数返回值只能是0-255的整数,其中0标识成功,1-255表示失败

   <2>函数代码执行时,一旦遇到return,函数代码终止执行,返回自定义的函数值[如果有的话]

   <3>函数返回值引入的好处是:若一个程序导致错误的情况有多种,假设每种错误都分别定义函数返回值,那么维护和调试会简单许多!


参数传递


参数传递不仅仅供函数体调用,任何想要调用的脚本代码只需要遵循语法格式写出调用语句即可调用。

在执行脚本时,后续加入多个参数,即所谓的将参数传递进脚本,如下

例1:为脚本传递多个参数,并调用这些参数

wKiom1YBTAKyW5s7AAEICjQixI4557.jpg

实现代码

1
2
3
4
5
6


#!/bin/bash

echo 
"The first paramater is  $1"
echo 
"The second paramater is $2"
echo 
"Paramaters Counts  -->  $#"
echo 
"All Paramaters are -->  $@"

红框的"1 2 3"即传递参数给该脚本,这里的$1, $2即对传递的参数的引用,其实本质是特殊变量。

$# 传递参数的总个数, $@ 打印输出全参数。还有别的特殊变量及用法 --> 参考 [9-13]Shell系列2——变量基础