函数定义

Shell 中定义函数有两种语法格式,都能达到同样的效果。选择哪种主要看个人习惯和团队规范。

第一种格式

使用 function 关键字,这是 Bash 特有的语法:

function 函数名() {
    命令1
    命令2
    ...
}

括号可以省略,写成这样也行:

function 函数名 {
    命令1
    命令2
    ...
}

第二种格式

这种格式更通用,兼容性更好,在 POSIX 标准的 Shell 中也能用:

函数名() {
    命令1
    命令2
    ...
}

推荐使用第二种格式,兼容性更好。如果确定只用 Bash,第一种写起来更直观。

一个简单的例子

#!/bin/bash

say_hello() {
    echo "你好,欢迎学习 Shell!"
}

say_hello
say_hello

运行结果:

你好,欢迎学习 Shell!
你好,欢迎学习 Shell!

函数定义后,调用时直接写函数名就行,不需要加括号。这点和其他编程语言不太一样,要注意。

函数命名规范

函数名最好能体现它的功能,让人一看就知道是干什么的。几个建议:

使用动词开头:比如 check_fileprint_logget_date,表示这个函数执行什么动作。

用下划线分隔单词:Shell 中习惯用下划线,比如 calculate_total,而不是驼峰式的 calculateTotal

避免和内置命令重名:别用 testcdecho 这些名字,会覆盖系统命令。

check_file_exists() {
    if [ -f "$1" ]; then
        return 0
    else
        return 1
    fi
}

print_current_time() {
    echo "当前时间:$(date '+%Y-%m-%d %H:%M:%S')"
}

函数必须先定义后调用

Shell 脚本是顺序执行的,函数必须在调用之前定义:

#!/bin/bash

func1() {
    echo "这是函数1"
}

func1
func2

func2() {
    echo "这是函数2"
}

运行会报错,因为调用 func2 的时候它还没定义。正确的做法是把所有函数定义放在脚本开头,或者放在单独的文件中通过 source 引入。

删除函数

定义好的函数可以用 unset 删除:

my_func() {
    echo "test"
}

unset -f my_func

删除后就不能再调用了,一般很少用到这个功能。

小结

  • 函数有两种定义格式,推荐使用 函数名() { } 的形式
  • 调用函数直接写函数名,不需要括号
  • 函数名要有意义,用下划线分隔单词
  • 函数必须先定义后调用