他の人が言ったように、それはできません。
ただし、コードを 1 つのファイルに配置して、メイン プログラムをファイルの先頭に配置し、他の関数をその下に定義する場合は、別の main
を作成することで実行できます。 関数。
例えば。
#!/bin/sh
main() {
if [ "$1" = yes ]; then
do_task_this
else
do_task_that
fi
}
do_task_this() {
...
}
do_task_that() {
...
}
main "[email protected]"; exit
main
を呼び出すとき ファイルの最後では、すべての関数が既に定義されています。 "[email protected]"
を明示的に渡す main
まで スクリプトのコマンド ライン引数を関数内で可視にするために必要です。
明示的な exit
main の呼び出しと同じ行に配置することは必須ではありませんが、スクリプト ファイルが変更された場合に実行中のスクリプトが台無しになるのを防ぐために使用できます。これがないと、シェルは main
以降、スクリプト ファイルからコマンドを読み込もうとします。 戻り値。 (実行前にシェルスクリプト全体を読む方法を参照してください)
いいえ、関数は呼び出し時にシェル環境に存在する必要があります。
Google の「Shell Style Guide」には、これに対する修正があります:
<ブロック引用>
main
という関数 少なくとも 1 つの他の関数を含めるのに十分な長さのスクリプトには必須です。
スクリプトの最後で、すべての関数の後、関数内にない唯一のステートメントとして、
main "[email protected]"
これは main
を呼び出します スクリプトに与えられたパラメーターを使用して関数を実行します。 main
関数はスクリプトの上部に配置できます (スタイル ガイドでは下部に配置するように指示されていますが、繰り返しになりますが、多くのことが書かれています)。
シェルが main
に到達したとき 呼び出し、スクリプト内のすべての関数が解析されているため、main
内から呼び出すことができます 関数。
いいえ、関数は使用する前に宣言する必要があります。シェル スクリプトは 1 行ずつ読み取られ、1 行ずつ実行されます。そのため、宣言が実行されるまで関数は存在しません。