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 main
fungsi 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 main
di akhir file, semua fungsi sudah ditentukan. Eksplisit lewat "$@"
ke main
diperlukan untuk membuat argumen baris perintah dari script yang terlihat dalam fungsi.
Eksplisit exit
pada 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 main
kembali. (lihat Bagaimana membaca seluruh skrip shell sebelum menjalankannya? )
[[ ${BASH_SOURCE[0]} = "$0" ]] && Main "$@"
untuk memanggil fungsi utama sehingga saya dapat sumbernya di skrip lain tanpaMain
dieksekusi. Kemudian saya dapat menggunakan kembali fungsi atau menulis tes untuk memeriksanya.main "$@"; exit
(denganexit
pada baris yang sama denganmain
) juga berguna sebagai perlindungan terhadap file yang sedang dimodifikasi saat ditafsirkan.exit
di baris yang sama sepertimain
kita memastikan shell tidak akan membaca apa pun lagi dari file setelahmain
kembali.main; exit
,main; exit $?
ataumain <EOF>
, dalam semua kasus, kode keluarmain
digunakan sebagai kode keluar dari skrip. Ituexit
hanya 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:
Di akhir skrip, setelah semua fungsi, sebagai satu-satunya pernyataan tidak dalam suatu fungsi, Anda akan miliki
Ini akan memanggil
main
fungsi dengan parameter apa pun yang diberikan skrip. Themain
Fungsi 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
main
panggilan, semua fungsi dalam skrip telah diuraikan dan karena itu dapat dipanggil dari dalammain
fungsi.sumber
Tidak, fungsi harus dideklarasikan sebelum digunakan. Script Shell dibaca baris demi baris dan ditindaki baris demi baris; jadi fungsi tidak ada sampai deklarasi dijalankan.
sumber
C
dalamnya nyaman.. yourfile
).if
pernyataan kosong di luar fungsi. Fungsi tidak harus didefinisikan ketika Anda menyatakan ituif
fungsi -mengandung, hanya ketika Anda menelepon itu.Shell tidak memiliki konsep
declaring
fungsi. Jadi, Anda tidak dapat memiliki deklarasi maju.Sebagai konsekuensinya, Anda harus memiliki implementasi fungsi dibaca oleh shell sebelum dapat dipanggil.
sumber
autoload f
mendeklarasikan fungsi, tetapi tubuhnya hanya dimuat pada permintaan pertama). Itu tidak berlaku untuk OPbash
sekalipun.