调用下面声明的函数

调用下面声明的函数

是否可以调用下面在 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 读取函数实现,然后才能调用它。

相关内容