type
status
date
slug
summary
tags
category
icon
password
Property
函数(function)是可以重复使用的代码片段,有利于代码的复用。它与别名(alias)的区别是,别名只适合封装简单的单个命令,函数则可以封装复杂的多行命令。
函数总是在当前 Shell 执行,这是跟脚本的一个重大区别,Bash 会新建一个子 Shell 执行脚本。如果函数与脚本同名,函数会优先执行。但是,函数的优先级不如别名,即如果函数与别名同名,那么别名优先执行。
Bash 函数定义的语法有两种:
fn
是自定义的函数名,函数代码就写在大括号之中。一个简单函数的例子
调用时,就直接写函数名,参数跟在函数名后面。
删除一个函数,可以使用
unset
命令:查看当前 Shell 已经定义的所有函数,可以使用
declare
命令。declare
命令不仅会输出函数名,还会输出所有定义。输出顺序是按照函数名的字母表顺序。由于会输出很多内容,最好通过管道命令配合more
或less
使用。declare
命令还支持查看单个函数的定义。declare -F
可以输出所有已经定义的函数名,不含函数体。参数变量
函数体内可以使用参数变量,获取函数参数。函数的参数变量,与脚本参数变量是一致的。
$1
~$9
:函数的第一个到第9个的参数。
$0
:函数所在的脚本名。
$#
:函数的参数总数。
$@
:函数的全部参数,参数之间使用空格分隔。
$*
:函数的全部参数,参数之间使用变量$IFS
值的第一个字符分隔,默认为空格,但是可以自定义。
如果函数的参数多于9个,那么第10个参数可以用
${10}
的形式引用,以此类推。示例脚本
test.sh
:运行该脚本,结果如下。
一个日志函数:
return 命令
return
命令用于从函数返回一个值。函数执行到这条命令,就不再往下执行了,直接返回了。函数将返回值返回给调用者。如果命令行直接执行函数,下一个命令可以用
$?
拿到返回值:return
后面不跟参数,只用于返回也是可以的。全局变量和局部变量,local 命令
Bash 函数体内直接声明的变量,属于全局变量,整个脚本都可以读取。这一点需要特别小心。
上面脚本的运行结果如下:
函数体内不仅可以声明全局变量,还可以修改全局变量。
函数里面可以用
local
命令声明局部变量:运行结果如下:
local
命令声明的$foo
变量,只在函数体内有效,函数体外没有定义。