回答:
他の人が言ったように、あなたはそれをすることはできません。
ただし、メインプログラムがファイルの先頭にあり、他の関数が以下に定義されるようにコードを1つのファイルに整理する場合は、別の main
関数ます。
例えば
#!/bin/sh
main() {
if [ "$1" = yes ]; then
do_task_this
else
do_task_that
fi
}
do_task_this() {
...
}
do_task_that() {
...
}
main "$@"; exit
main
ファイルの最後で呼び出すと、すべての関数が既に定義されています。明示的に渡す"$@"
ためにmain
機能的に目に見えるスクリプトのコマンドライン引数を行う必要があります。
exit
mainの呼び出しと同じ行での明示的な指定は必須ではありませんが、スクリプトファイルが変更された場合に実行中のスクリプトが混乱するのを防ぐために使用できます。これがないと、シェルはmain
戻り後もスクリプトファイルからコマンドを読み続けようとします。(実行前にシェルスクリプト全体を読み取る方法を参照してください?)
[[ ${BASH_SOURCE[0]} = "$0" ]] && Main "$@"
では、Main
実行せずに別のスクリプトでソースできるように、メイン関数を呼び出すためによく使用します。次に、関数を再利用するか、テストを作成してチェックします。
main "$@"; exit
(とexit
同じ行にmain
)ことは、解釈中にファイルが変更されるのを防ぐためにも役立ちます。
exit
と同じ行に置くと、何かを実行する前にすべてを読み取る必要があります(これらの関数の定義を除く)。main
main
main; exit
、main; exit $?
またはを使用するかは問題ではありません。main <EOF>
すべての場合main
、スクリプトの終了コードとしての終了コードが使用されます。これexit
は、実行中に誰かがスクリプトを編集した場合に物事が台無しになるのを防ぐためです。
いいえ、関数はそれらを呼び出すときにシェル環境に存在する必要があります。
Googleの「シェルスタイルガイド」には、これに対する修正があります。
呼び出される関数
main
は、少なくとも1つの他の関数を含むのに十分な長さのスクリプトに必要です。
スクリプトの最後で、すべての関数の後、関数内にない唯一のステートメントとして、次のようになります。
main "$@"
これによりmain
、スクリプトに指定されたパラメーターで関数が呼び出されます。main
関数はスクリプトの先頭に配置することができる(スタイルガイドを一番下にそれを置くことを言いますが、その後、再び、それは多くのことを言います)。
シェルがmain
呼び出しに到達すると、スクリプト内のすべての関数が解析されているため、main
関数内から呼び出すことができます。
いいえ、関数を使用する前に宣言する必要があります。シェルスクリプトは1行ずつ読み取られ、1行ずつ実行されます。そのため、関数は宣言が実行されるまで存在しません。
C
、それは快適です。
. yourfile
)。
if
、関数の外部にむき出しのステートメントはありません。関数は、-を含む関数を宣言するif
とき、呼び出すときに定義する必要はありません。
シェルには次の概念はありません declaring
関数。したがって、前方宣言はできません。
結果として、シェルを呼び出す前に、シェルによって関数実装を読み取らせる必要があります。
autoload f
bash