在 Bash 或 Shell 脚本中转发函数声明?

Posted

技术标签:

【中文标题】在 Bash 或 Shell 脚本中转发函数声明?【英文标题】:Forward function declarations in a Bash or a Shell script? 【发布时间】:2012-11-15 07:45:39 【问题描述】:

bash 中是否有这样的东西,或者至少有类似的东西(解决方法),例如在 C/C++ 中众所周知的前向声明?

或者有这样的事情,例如它总是一次执行(一行接一行)?

如果没有前向声明,我应该怎么做才能使我的脚本更易于阅读。它相当长,并且这些函数定义在开始时与全局变量混合在一起,使我的脚本看起来很丑陋且难以阅读/理解)?我要求为此类案例学习一些众所周知的/最佳实践。


例如:

# something like forward declaration
function func

# execution of the function
func

# definition of func
function func

    echo 123

【问题讨论】:

【参考方案1】:

很好的问题。我的大部分脚本都使用这样的模式:

#!/bin/bash

main() 
    foo
    bar
    baz


foo() 


bar() 


baz() 


main "$@"

您可以从上到下阅读代码,但实际上直到最后一行才开始执行。通过将 "$@" 传递给 main(),您可以像往常一样访问命令行参数 $1$2 等。

【讨论】:

您好,在您的示例中,您如何构建必须在 foo/bar/baz 之间共享的数据?通常我只是把它放在脚本的顶部。使用函数时是否仍然如此?还是将全局数据放在 main 中,然后将其作为参数传递给 foo/bar/baz 更好?最佳做法是什么? 我更喜欢论点。除此之外,我将在mainmain 之后的函数中设置全局变量(例如setupparseArguments)。我避免在main 之上设置全局变量——代码不应超出main 这似乎有点类似于 if _ _ name _ _ == "_ _ main _ _": main() 在 python 中所做的事情 这在使用像Bats 这样的工具来测试你的脚本时也很棒,将所有东西分解成函数使得测试单个组件变得更加容易。另见blog post【参考方案2】:

当我的 bash 脚本增长过多时,我会使用包含机制:

文件allMyFunctions

foo() 


bar() 


baz() 

文件main

#!/bin/bash

. allMyfunctions

foo
bar
baz

【讨论】:

就个人而言,当一个 shell 脚本开始超过一个文件时,我倾向于切换到另一种语言;-) 使用source allMyfunctions不是更好吗? @pydoge: source 不符合 POSIX。 bashsource 定义为 . 的别名:它们在功能上是等效的。

以上是关于在 Bash 或 Shell 脚本中转发函数声明?的主要内容,如果未能解决你的问题,请参考以下文章

Jenkins总结3-shell脚本

Linux教程 - 在Shell脚本中声明和使用布尔变量示例

shell脚本检测IP地址

创建shell脚本

shell命令中用source 和sh(或者bash)执行脚本的区别,以及export的作用

shell命令中用source 和sh(或者bash)执行脚本的区别,以及export的作用