在 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 更好?最佳做法是什么? 我更喜欢论点。除此之外,我将在main
或main
之后的函数中设置全局变量(例如setup
或parseArguments
)。我避免在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。 bash
将 source
定义为 .
的别名:它们在功能上是等效的。以上是关于在 Bash 或 Shell 脚本中转发函数声明?的主要内容,如果未能解决你的问题,请参考以下文章
Linux教程 - 在Shell脚本中声明和使用布尔变量示例