我们在一个脚本中会用到各种各样的变量、判断和循环等等集合,那我们需要重复的利用这个集合时,会使脚本的工作量非常的大,这个时候就可以使用函数将一个这样的集合写成一个函数脚本,当我们需要使用到这个集合的时候可以直接调用这个函数即可。
定义一个函数就是写一个函数的格式,分为两种:
格式一:规范写法
function 函数名 { #函数的说明,主要是说明一下函数的主要功能,这是可以自定义的。函数名的规则与变量名一致。
command #命令——函数内容
} #由{}包围的部分称为函数体,调用一个函数,实际上就是执行函数中的代码。
格式二:简洁写法
函数名(){
command
}
函数定义完之后并不会自动执行,需要调用才行,好处在于可以写一段功能代码作为函数,有需要就直接调用。定义的时候哪怕出现语法错误也没关系,不调用就不会报错。当然我们写函数最终目的还是为了调用,为了实现某个功能块。
local命令:定义局部变量
在 Shell 脚本中函数的·执行并不会开启一个新的子 Shell,而是仅在当前定义的 Shell 环境中有效。如果Shell脚本中的变量没有经过特殊设定,默认在整个脚本中都是有效的。在编写脚本时,有时需要将变量的值限定在函数内部,可以通过内置命令local来实现。函数内部变量的使用,可以避免函数内外同时出现同名变量对脚本结果的影响。
local命令:将变量限定在函数内部使用,格式:函数名 (){local 函数名}
上述脚本中a 函数内部使用了local命令设置变量a,其作用是将变量a限定在函数内部。a函数外部同样定义了变量a,内部变量a和全局变量a互不影响。脚本执行时先调用了函数a,函数内部变量a为1,所以输出结果是1。调用完函数之后,给变量a赋值为2,再打印外部变量a,所以又输出2。
在脚本里定义的变量或者在函数体没有声明为本地变量的都为全局变量,意思是在当前shell环境都识别,如果需要这个变量只在函数中使用则可以在函数中用local关键字声明,这样即使函数体外有个重名的变量也没关系,不影响在函数体的使用。
return表示退出函数并返回一个退出值,脚本中可以用$?变量显示该值。
使用原则:
1、函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码。
2、退出状态码必须是0~255,超出时值将为取余256 。
使用方法:
函数名(){
command
return 1
}
当执行这个函数之后我们在命令行输入echo $?之后,返回值就是1
直接输入函数名即可:
执行函数时,函数名前面的function或函数后面的()都不需要添加。
函数名必须是唯一,如果先定义了一个,再用同样的名称定义,第二个会覆盖第一个的功能。例如:
函数的定义必须要在执行的程序前定义或加载,例如:
从上图可以看出,当函数的调用在函数的定义之前的话,则会报错,但是如果调用写在定义之后的话则无论函数c写在哪里,都能执行:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rCju7WLf-1656983784669)(C:\Users\Tu\AppData\Roaming\Typora\typora-user-images\image-20220704194725435.png)]
由此可以看出,不一定要在脚本开头就定义函数,只要调用之前定义就可以。
shell中的位置参数均可以作为函数的参数进行传递,此时父脚本的参数会临时被函数的参数所掩盖或隐藏。函数的参数变量是在函数体内进行定义。
这里相当于调用了脚本的参数了,然后把脚本的位置变量传递给函数进行执行。
当我们需要去调用函数的时候分几种情况:
第一种情况就是上文写到的函数的执行,在函数脚本的最后写上函数名即可:
函数名(){
command
}
函数名 #表示调用函数在命令行执行即可
第二种情况是在文件中调用函数,即在另一个文件中声明调用该函数:
shell各种程序的执行顺序为:系统别名—>函数—>系统命令—>可执行文件等。
函数执行时,会和调用它的脚本共享变量,也可以为函数设定局部变量及特殊位置参数。
在shell函数里面,return和exit的功能相似,区别是return会退出函数,而exit直接退出脚本。return语句会返回一个值给调用函数的程序,exit则会返回一个值给执行当前脚本的shell。
如果将函数单独存放为一个文件,在加载时需要使用执行脚本的命令去执行它。
在函数内部一般使用local定义局部变量,仅在函数体内有效。
END