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

问题描述 投票:0回答:3

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

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

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


例如:

# something like forward declaration
function func

# execution of the function
func

# definition of func
function func
{
    echo 123
}
bash function sh forward-declaration
3个回答
223
投票

不,bash 没有前向函数声明。我的大多数脚本都使用这样的模式:

#!/bin/bash

main() {
    foo
    bar
    baz
}

foo() {
}

bar() {
}

baz() {
}

main "$@"

你可以从上到下阅读代码,但直到最后一行它才真正开始执行。通过将

"$@"
传递给 main(),您可以像平常一样访问命令行参数
$1
$2
等。


34
投票

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

文件

allMyFunctions

foo() {
}

bar() {
}

baz() {
}

文件

main

#!/bin/bash

. allMyfunctions

foo
bar
baz

0
投票

您可以拥有脚本源部分:

#!/bin/bash
. <( sed -n '/^#SOURCE-BEGIN/,/^#SOURCE-END/{//!p;}' $0 )
greeting "$@"
foo hey

#SOURCE-BEGIN
greeting() {
  for i in "$@"
  do
    echo ">[$i]"
  done
}

foo() {
  echo in foo
  echo "arg passed in: $1"
}
#SOURCE-END

echo good bye
$ ./myscript.sh hello world "one string"
>[hello]
>[world]
>[one string]
in foo
arg passed in: hey
good bye

我使用进程替换 (

<(....)
) 来获取
sed
命令的输出。
sed
语法来自这里,搜索
What about the classic sed solution?

© www.soinside.com 2019 - 2024. All rights reserved.