2012-11-27 20 views
64

bashにあるか、少なくともC/C++でよく知られているフォワード宣言のようなものがありますか?Bashスクリプトまたはシェルスクリプトの関数の前進宣言?

このようなことは、たとえば、常に1つのパス(行の後ろ)で実行されるためですか?

フォワード宣言がない場合は、スクリプトを読みやすくするために何をすべきですか。むしろ長いですが、最初にこれらの関数定義をグローバル変数と混同すると、スクリプトが醜く見えにくくなり、読みやすく/理解しやすくなります)。私はそのような場合のいくつかのよく知られている/ベストプラクティスを学びたいと思っています。例えば


# 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

これはPythonで 'if _ _ name _ _ ==" _ _ main _ _ "と同じように見えます。 –

26

私のbashスクリプトはあまり成長したとき、私には、メカニズムを使用します。

ファイルallMyFunctions

foo() { 
} 

bar() { 
} 

baz() { 
} 

はファイルmain

#!/bin/bash 

. allMyfunctions 

foo 
bar 
baz 
+16

個人的に、シェルスクリプトが1つのファイルを越えて成長し始めると、私は別の言語;-) –

+0

プラス1 | [POSIX](https://en.wikipedia.org/wiki/POSIX) - 準拠。 – Vlastimil