是否可以调用下面在 bash 中声明的函数?
例子
if [ "$input" = "yes" ]; then
YES_FUNCTION
elif [ "$input" = "no" ]; then
NO_FUNCTION
else
exit 0;
fi
YES_FUNCTION()
{
.....
.....
}
NO_FUNCTION()
{
.....
.....
}
答案1
正如其他人所说,你不能那样做。
但是,如果您想将代码排列到一个文件中,使主程序位于文件的顶部,而其他函数定义在下面,则可以通过单独的main
函数来实现。
例如
#!/bin/sh
main() {
if [ "$1" = yes ]; then
do_task_this
else
do_task_that
fi
}
do_task_this() {
...
}
do_task_that() {
...
}
main "$@"; exit
当我们main
在文件末尾调用时,所有函数都已定义。需要显式传递"$@"
tomain
才能使脚本的命令行参数在函数中可见。
与调用 main 位于同一行的显式exit
不是强制性的,但可以用来防止正在运行的脚本在脚本文件被修改时变得混乱。如果没有它,shell 将在返回后尝试继续从脚本文件读取命令main
。 (看如何在执行shell脚本之前读取整个shell脚本?)
答案2
不,这些函数在调用它们时必须存在于 shell 环境中。
谷歌的《Shell 风格指南》有一个解决这个问题的方法:
对于足够长的脚本,需要调用一个函数
main
来包含至少一个其他函数。
在脚本的最后,在所有函数之后,作为唯一不在函数中的语句,您将拥有
main "$@"
这将main
使用脚本指定的任何参数来调用该函数。该main
函数可以位于脚本的顶部(样式指南说将其放在底部,但话又说回来,它说了很多事情)。
当 shell 进行调用时main
,脚本中的所有函数都已被解析,因此可以从main
函数内部调用。
答案3
不,函数必须在使用之前声明。 Shell 脚本是逐行读取并执行的;所以函数在其声明被执行之前并不存在。
答案4
shell 没有declaring
函数的概念。所以你不能有前瞻性声明。
因此,您需要让 shell 读取函数实现,然后才能调用它。