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_file、print_log、get_date,表示这个函数执行什么动作。
用下划线分隔单词:Shell 中习惯用下划线,比如 calculate_total,而不是驼峰式的 calculateTotal。
避免和内置命令重名:别用 test、cd、echo 这些名字,会覆盖系统命令。
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
删除后就不能再调用了,一般很少用到这个功能。
函数名() { } 的形式