Jawaban:
Seperti kata orang lain, Anda tidak bisa melakukan itu.
Tetapi jika Anda ingin mengatur kode menjadi satu file sehingga program utama berada di bagian atas file, dan fungsi-fungsi lain didefinisikan di bawah ini, Anda dapat melakukannya dengan memiliki mainfungsi terpisah .
Misalnya
#!/bin/sh
main() {
if [ "$1" = yes ]; then
do_task_this
else
do_task_that
fi
}
do_task_this() {
...
}
do_task_that() {
...
}
main "$@"; exit
Ketika kita memanggil maindi akhir file, semua fungsi sudah ditentukan. Eksplisit lewat "$@"ke maindiperlukan untuk membuat argumen baris perintah dari script yang terlihat dalam fungsi.
Eksplisit exitpada baris yang sama dengan panggilan ke main tidak wajib, tetapi dapat digunakan untuk mencegah skrip yang sedang berjalan kacau jika file skrip dimodifikasi. Tanpa itu, shell akan mencoba untuk melanjutkan membaca perintah dari file skrip setelah mainkembali. (lihat Bagaimana membaca seluruh skrip shell sebelum menjalankannya? )
[[ ${BASH_SOURCE[0]} = "$0" ]] && Main "$@"untuk memanggil fungsi utama sehingga saya dapat sumbernya di skrip lain tanpa Maindieksekusi. Kemudian saya dapat menggunakan kembali fungsi atau menulis tes untuk memeriksanya.
main "$@"; exit(dengan exitpada baris yang sama dengan main) juga berguna sebagai perlindungan terhadap file yang sedang dimodifikasi saat ditafsirkan.
exitdi baris yang sama seperti mainkita memastikan shell tidak akan membaca apa pun lagi dari file setelah mainkembali.
main; exit, main; exit $?atau main <EOF>, dalam semua kasus, kode keluar maindigunakan sebagai kode keluar dari skrip. Itu exithanya untuk mencegah hal-hal menjadi kacau jika seseorang mengedit skrip saat sedang berjalan.
Tidak, fungsinya harus ada di lingkungan shell pada saat memanggilnya.
Google "Shell Style Guide" memiliki untuk memperbaiki ini:
Fungsi yang dipanggil
maindiperlukan untuk skrip yang cukup lama untuk memuat setidaknya satu fungsi lainnya.
Di akhir skrip, setelah semua fungsi, sebagai satu-satunya pernyataan tidak dalam suatu fungsi, Anda akan miliki
main "$@"
Ini akan memanggil mainfungsi dengan parameter apa pun yang diberikan skrip. The mainFungsi bisa terletak di bagian atas script (panduan gaya mengatakan untuk meletakkannya di bagian bawah, tetapi sekali lagi, ia mengatakan banyak hal).
Ketika shell masuk ke mainpanggilan, semua fungsi dalam skrip telah diuraikan dan karena itu dapat dipanggil dari dalam mainfungsi.
Tidak, fungsi harus dideklarasikan sebelum digunakan. Script Shell dibaca baris demi baris dan ditindaki baris demi baris; jadi fungsi tidak ada sampai deklarasi dijalankan.
Cdalamnya nyaman.
. yourfile).
ifpernyataan kosong di luar fungsi. Fungsi tidak harus didefinisikan ketika Anda menyatakan itu iffungsi -mengandung, hanya ketika Anda menelepon itu.
Shell tidak memiliki konsep declaringfungsi. Jadi, Anda tidak dapat memiliki deklarasi maju.
Sebagai konsekuensinya, Anda harus memiliki implementasi fungsi dibaca oleh shell sebelum dapat dipanggil.
autoload fmendeklarasikan fungsi, tetapi tubuhnya hanya dimuat pada permintaan pertama). Itu tidak berlaku untuk OP bashsekalipun.