2012-11-27 27 views
64

bash中是否存在这样的事情,或者至少是类似于前向声明(类似于C/C++中已知的前向声明)的变通方法?在Bash或Shell脚本中转​​发函数声明?

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

如果没有前向声明,我该怎么做才能让我的脚本更易于阅读。这是相当长的,开头的这些函数定义,与全局变量混合在一起,使我的脚本看起来丑陋难以阅读/理解)?我要求了解一些这类案例的知名/最佳实践。


例如:

# something like forward declaration 
function func 

# execution of the function 
func 

# definition of func 
function func 
{ 
    echo 123 
} 

回答

135

大问题。我用这样的模式对于大多数我的脚本:

#!/bin/bash 

main() { 
    foo 
    bar 
    baz 
} 

foo() { 
} 

bar() { 
} 

baz() { 
} 

main "[email protected]" 

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

+3

嗨,你怎么结构有数据在你的例子中在foo/bar/baz之间共享?通常我只是把它放在脚本的顶部。使用函数时,情况仍然如此吗?或者更好地将全局数据放在main中,然后将它作为参数传递给foo/bar/baz?最佳做法是什么? – bodacydo

+4

我更喜欢参数。除此之外,我将在main中设置全局变量或在main之后设置一个函数(例如'setup'或'parseArguments')。我避免在'main'上设置全局变量 - 代码不应超出'main'。 –

+0

这似乎有点类似于'if _ _ name _ _ == == _ _ main _ _“:main()在python中的作用 –

26

当我的bash脚本增长太多,我使用包括机制:

文件allMyFunctions

foo() { 
} 

bar() { 
} 

baz() { 
} 

文件main

#!/bin/bash 

. allMyfunctions 

foo 
bar 
baz 
+16

个人而言,当shell脚本开始生长超过一个文件时,我倾向于切换到不同的语言;-) –

+0

加1 |对于[POSIX](https://en.wikipedia.org/wiki/POSIX)-compliance。 – Vlastimil