本章介绍 Bash 函数的用法。
函数(function)是可以重复使用的代码片段,有利于代码的复用。它与别名(alias)的区别是,别名只适合封装简单的单个命令,函数则可以封装复杂的多行命令。
函数总是在当前 Shell 执行,这是跟脚本的一个重大区别,Bash 会新建一个子 Shell 执行脚本。如果函数与脚本同名,函数会优先执行。但是,函数的优先级不如别名,即如果函数与别名同名,那么别名优先执行。
Bash 函数定义的语法有两种,这两种写法是等价的
1 | # 第一种,`fn`是自定义的函数名,函数代码就写在大括号之中 |
下面是一个简单函数的例子。
1 | hello() { |
上面代码中,函数体里面的$1
表示函数调用时的第一个参数。调用时,就直接写函数名,参数跟在函数名后面。
1 | $ hello world |
删除一个函数
1 | unset -f functionName |
查看当前shell定义的函数
1 | # 输出函数名和函数定义,由于会输出很多内容,最好通过管道命令配合`more`或`less`使用 |
函数体内可以使用参数变量,获取函数参数。函数的参数变量,与脚本参数变量是一致的。
$1
~`$9`:函数的第一个到第9个的参数。$0
:函数所在的脚本名。生产场景:用户的输入不符合脚本要求时,打印脚本名字以及使用帮助。$#
:函数的参数总数。$@
:函数的全部参数,参数之间使用空格分隔。$*
:函数的全部参数,参数之间使用变量$IFS
值的第一个字符分隔,默认为空格,但是可以自定义。注意:
$*
和$@
外面都可以加上双引号,前者代表所有变量为一个字符串,后者代表所有变量仍为独立字符串,是传递多参数的最佳方式。${10}
的形式引用,以此类推。下面是一个日志函数的例子。
1 | function log_msg { |
使用方法如下:
1 | $ log_msg "This is sample log message" |
return
命令用于从函数返回一个值。函数执行到这条命令,就不再往下执行,直接返回。
1 | function func_return_value { |
函数将返回值返回给调用者。如果命令行直接执行函数,下一个命令可以用$?
拿到返回值。
1 | $ func_return_value |
return
后面不跟参数,只用于返回也是可以的。
由于函数体是在在当前shell中执行的,函数体内可以声明和修改全局变量,在整个脚本内都可以读取。
1 | # 脚本 test.sh |
上面脚本的运行结果如下。
1 | $ bash test.sh |
要想在函数体里面使用局部变量,可以用local
命令来声明。
1 |
|
上面脚本的运行结果如下。
1 | $ bash test.sh |
上面例子中,local
命令声明的$foo
变量,只在函数体内有效,函数体外没有定义。