函数(function)是可以重复使用的代码片段,有利于代码的复用。它与别名(alias)的区别是,别名只适合封装简单的单个命令,函数则可以封装复杂的多行命令。
可使用如下形式定义函数,其中关键字function可以省略。
function funName() {
# 函数体
}
一、参数变量
shell中常见的参数和特殊变量如下:
变量 | 说明 |
---|---|
$1~$9 | 函数的第一个到第9个参数 |
${10} | 函数的第10个参数 |
$0 | 函数所在脚本名 |
$# | 函数的参数总数 |
$@ | 函数的全部参数,参数间用空格分隔 |
$* | 函数的全部参数,参数之间使用变量$IFS值的第一个字符分隔,默认为空格,可以自定义。 |
#? | 如在命令行直接执行函数,下一个命令可以使用$?拿到返回值 |
$FUNCNAME | 函数名称(仅在函数内部有值) |
function testA ()
{
echo "$@";
echo "${0}: ${1}, ${2}, ${3}, ${4}";
echo "$#"
}
二、函数使用
函数通常有如下三种使用方式:
- 在交互式环境下定义函数
- 将函数放在脚本文件中,作为脚本文件的一部分
- 可放在只包含函数的单独文件中
2.1 交互环境下定义函数
function testA () {
echo "testA: $1, $2, $3, $4"
}
在交互式环境下,定义函数
在交互式环境中调用函数
定义该函数之后,该函数会在当前Bash进程退出前一直保留。当前Bash进程退出时,该函数立即失效。可以在当前Bash进程中运行 unset 命令,使该函数立即失效
unset testA
2.2 脚本中定义及使用函数
函数定义和使用在同一个文件中,函数的有效期为此脚本创建的bash子进程的生命期。
如下testB.sh 文件内容如下,包含了函数的定义和使用。
function testB () {
echo "testA: $1, $2, $3, $4"
}
testB a b
脚本执行结果如下:
2.3 函数文件
将经常使用的函数存入函数文件,然后通过函数文件载入Shell的方式,实现函数复用。
定义如下的func.sh 文件
function funcA () {
echo "funcA: $1, $2, $3, $4"
}
function funcB () {
echo "funcB: $1, $2, $3, $4"
}
可通过如下两种方式将函数文件载入当前bash进程
source funcFile
. funcFile
三、查看shell定义的函数
可以使用declare 命令,查看shell中定义的函数。
3.1 declare -f
不仅会输出函数名,还会输出所有定义。输出顺序是按照函数名的字母表顺序。由于会输出很多内容,最好通过管道命令配合more或less使用。
3.2 declare -f functionName
使用declare -f functionName,可以查看单个函数定义
3.3 declare -F
可以使用declare -F 查看所有已经定义的函数名,不含函数体。
四、函数变量
Bash 函数体内直接声明的变量,属于全局变量,整个脚本都可以读取。如需定义局部变量,可以使用local关键字。
foo=1
fn () {
local foo
foo=2
echo "fn: foo = $foo"
}
fn
echo "global: foo = $foo"
结果如下: