web-dev-qa-db-ja.com

Bashまたはシェルスクリプトで関数宣言を転送しますか?

bashにそのようなことがありますか、たとえばC/C++でよく知られている前方宣言のような少なくとも類似した(回避策)がありますか?

または、たとえば、常に1つのパスで実行されるため、そのようなことがあります(行ごとに)?

前方宣言がない場合、スクリプトを読みやすくするためにどうすればよいですか。それはかなり長く、最初にこれらの関数定義がグローバル変数と混合されているため、スクリプトが見苦しくなり、読みにくい/理解しづらくなっています)?このような場合のよく知られた/ベストプラクティスを学ぶことを求めています。


例えば:

# something like forward declaration
function func

# execution of the function
func

# definition of func
function func
{
    echo 123
}
88
Kiril Kirov

いい質問ですね。ほとんどのスクリプトで次のようなパターンを使用しています。

#!/bin/bash

main() {
    foo
    bar
    baz
}

foo() {
}

bar() {
}

baz() {
}

main "$@"

コードは上から下まで読むことができますが、実際には最後の行まで実行を開始しません。 "$@"をmain()に渡すことで、コマンドライン引数$1$2などに通常どおりアクセスできます。

177
John Kugelman

私のbashスクリプトが大きくなりすぎた場合、インクルードメカニズムを使用します。

ファイルallMyFunctions

foo() {
}

bar() {
}

baz() {
}

ファイルmain

#!/bin/bash

. allMyfunctions

foo
bar
baz
29
mouviciel