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


95

例如bash,在C / C ++中是否存在这样的东西,或者至少有类似(替代方法)的东西,例如正向声明?

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

如果没有前向声明,我应该怎么做才能使脚本更易于阅读。时间太长,这些函数定义在开始时就与全局变量混合在一起,使我的脚本看起来难看并且难以阅读/理解。我要求学习一些针对此类情况的知名/最佳做法。


例如:

# something like forward declaration
function func

# execution of the function
func

# definition of func
function func
{
    echo 123
}

Answers:


190

好问题。我的大多数脚本都使用这样的模式:

#!/bin/bash

main() {
    foo
    bar
    baz
}

foo() {
}

bar() {
}

baz() {
}

main "$@"

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


3
嗨,您如何构造示例中必须在foo / bar / baz之间共享的数据?通常,我只是将其放在脚本的顶部。使用函数时是否仍然如此?还是将全局数据放入main,然后将其作为参数传递给foo / bar / baz更好?最佳做法是什么?
bodacydo

4
我更喜欢争论。除非如此,main否则我将在函数之后或函数中设置全局变量main(例如setupparseArguments)。我避免在上面设置全局变量main-代码不应超出范围main
John Kugelman

这似乎有点类似于if _ _ name _ _ == "_ _ main _ _": main()python中的功能
Sergiy Kolodyazhnyy

当使用Bats之类的工具测试脚本时,这也很棒,将所有内容分解为功能可以使测试各个组件变得更加容易。另请参阅博客文章
dragon788 '18

30

当我的bash脚本增长太多时,我会使用一个include机制:

档案allMyFunctions

foo() {
}

bar() {
}

baz() {
}

档案main

#!/bin/bash

. allMyfunctions

foo
bar
baz

27
就个人而言,当Shell脚本开始越过一个文件时,我倾向于切换到另一种语言;-)
Joachim Sauer 2012年

使用会更好source allMyfunctions吗?
pydoge

4
@pydoge:source不符合POSIX。bash定义source为的别名.:它们在功能上等效。
mouviciel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.