在 Linux Shell 中,函数是一组可重复使用的命令序列,能够提高脚本的模块化与可维护性。Shell 函数的定义语法主要有两种:标准 POSIX 格式和Bash 扩展格式。标准格式为 函数名() { 命令列表; },而 Bash 允许使用 function 函数名 { 命令列表; } 或两者组合。建议优先使用不带 function 关键字的 POSIX 格式,以保证跨 Shell 兼容性。

定义函数时,花括号前后必须使用空格或换行,且命令列表应以分号结尾(或换行)。例如:hello() { echo "Hello, World!"; }。函数定义不会立即执行,需通过函数名后直接调用,如 hello。注意调用时不要加括号,否则会导致语法错误(加括号是子 Shell 语法,用于执行外部命令)。
Shell 函数支持位置参数,通过 $1、$2、$@ 等内部变量获取调用时传入的参数。例如:greet() { echo "Hello, $1!"; },调用 greet Alice 输出 "Hello, Alice!"。函数内也可使用 $# 获取参数个数,$* 或 $@ 获取所有参数。参数处理与脚本主体完全一致。
函数的返回值使用 return 语句,返回一个 0~255 的整数,0 表示成功,非零表示错误码。注意 return 不会输出字符串,若需返回字符串,应使用 echo 输出并通过命令替换捕获:result=$(my_func)。调用函数后,可通过 $? 获取返回值。
函数内部可定义局部变量,使用 local 关键字声明,避免污染全局作用域。例如:local temp_var="value"。局部变量只在当前函数及其调用的子函数内可见。未使用 local 声明的变量默认为全局变量,函数内修改会影响脚本全局。
函数可以嵌套定义,即一个函数内部定义另一个函数,但需注意作用域。此外,函数名不可与系统命令或别名重名,否则可能产生冲突。若需覆盖或隐藏外部命令,可使用 command 关键字调用原始命令。
在较大脚本中,建议将函数定义放在脚本开头,或单独使用 source 命令引入外部函数库文件。例如:source /path/to/lib.sh。调试函数时,可使用 set -x 启用追踪,或使用 declare -f 列出当前 Shell 中所有已定义的函数。
典型示例:一个计算两数之和的函数 add() { local sum=$(( $1 + $2 )); echo $sum; return 0; },调用 result=$(add 3 5) 后 $result 为 8。掌握这些要点后,即可在 Linux Shell 脚本中高效创建和使用函数。

查看详情

查看详情