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

Kir*_*rov 89 bash function sh forward-declaration

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

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

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


例如:

# something like forward declaration
function func

# execution of the function
func

# definition of func
function func
{
    echo 123
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*ica 179

好问题.对于我的大多数脚本,我都使用这样的模式:

#!/bin/bash

main() {
    foo
    bar
    baz
}

foo() {
}

bar() {
}

baz() {
}

main "$@"
Run Code Online (Sandbox Code Playgroud)

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

  • 我更喜欢争论.除此之外,我将在`main`之后或在`main`之后的函数中设置全局变量(例如,`setup`或`parseArguments`).我避免将全局变量设置在`main`之上 - 代码不应该超出`main`. (4认同)
  • 嗨,在你的例子中,如何构建必须在foo/bar/baz之间共享的数据?通常我只是把它放在脚本的顶部.使用功能时仍然如此吗?或者将全局数据放在main中,然后将其作为参数传递给foo/bar/baz是否更好?什么是最佳做法? (3认同)

mou*_*iel 29

当我的bash脚本增长太多时,我使用了一个包含机制:

档案allMyFunctions:

foo() {
}

bar() {
}

baz() {
}
Run Code Online (Sandbox Code Playgroud)

档案main:

#!/bin/bash

. allMyfunctions

foo
bar
baz
Run Code Online (Sandbox Code Playgroud)

  • 就个人而言,当一个shell脚本开始增长超过一个文件时,我倾向于切换到另一种语言;-) (25认同)
  • @pydoge:`source`不兼容POSIX。“ bash”将“ source”定义为“。”的别名:它们在功能上是等效的。 (3认同)