Câu trả lời:
Giống như những người khác đã nói, bạn không thể làm điều đó.
Nhưng nếu bạn muốn sắp xếp mã thành một tệp sao cho chương trình chính nằm ở đầu tệp và các chức năng khác được xác định bên dưới, bạn có thể thực hiện bằng cách có một main
chức năng riêng .
Ví dụ
#!/bin/sh
main() {
if [ "$1" = yes ]; then
do_task_this
else
do_task_that
fi
}
do_task_this() {
...
}
do_task_that() {
...
}
main "$@"; exit
Khi chúng tôi gọi main
ở cuối tập tin, tất cả các chức năng đã được xác định. Hoàn toàn chuyển "$@"
đến main
được yêu cầu để làm cho các đối số dòng lệnh của tập lệnh hiển thị trong hàm.
Rõ ràng exit
trên cùng một dòng với lệnh gọi tới main là không bắt buộc, nhưng có thể được sử dụng để ngăn tập lệnh đang chạy bị rối nếu tập tin tập lệnh bị sửa đổi. Không có nó, shell sẽ cố gắng tiếp tục đọc các lệnh từ tệp script sau khi main
trả về. (xem Cách đọc toàn bộ tập lệnh shell trước khi thực thi nó? )
[[ ${BASH_SOURCE[0]} = "$0" ]] && Main "$@"
để gọi hàm chính để tôi có thể lấy nó trong tập lệnh khác mà không Main
bị thực thi. Sau đó, tôi có thể sử dụng lại các chức năng hoặc viết các bài kiểm tra để kiểm tra chúng.
main "$@"; exit
(với exit
trên cùng một dòng main
) cũng hữu ích như một biện pháp bảo vệ chống lại tập tin bị sửa đổi trong khi nó được giải thích.
exit
trên cùng một dòng vì main
chúng ta đảm bảo shell sẽ không đọc lại bất cứ thứ gì từ tệp sau khi main
trả về.
main; exit
, main; exit $?
hoặc main <EOF>
, trong mọi trường hợp, mã thoát của main
được sử dụng làm mã thoát của tập lệnh. Các exit
sẽ chỉ để ngăn chặn điều bị sai lầm nếu ai đó chỉnh sửa kịch bản trong khi nó đang chạy.
Không, các chức năng phải tồn tại trong môi trường shell tại thời điểm gọi chúng.
"Hướng dẫn phong cách Shell" của Google có cách khắc phục:
Một hàm được gọi
main
là cần thiết cho các tập lệnh đủ dài để chứa ít nhất một hàm khác.
Ở phần cuối của tập lệnh, sau tất cả các hàm, như câu lệnh duy nhất không có trong một hàm, bạn sẽ có
main "$@"
Điều này sẽ gọi main
hàm với bất kỳ tham số nào mà tập lệnh được đưa ra. Các main
chức năng có thể được bố trí ở phía trên cùng của kịch bản (hướng dẫn phong cách nói để đặt nó ở phía dưới, nhưng sau đó một lần nữa, nó nói nhiều điều).
Khi shell nhận được main
cuộc gọi, tất cả các hàm trong tập lệnh đã được phân tích cú pháp và do đó có thể được gọi từ bên trong main
hàm.
Không, các chức năng phải được khai báo trước khi chúng được sử dụng. Các kịch bản Shell được đọc từng dòng và hành động theo từng dòng; vì vậy một hàm không tồn tại cho đến khi khai báo của nó được thực thi.
C
nó thoải mái.
. yourfile
).
if
câu lệnh trần bên ngoài hàm. Chức năng không cần phải được định nghĩa khi bạn tuyên bố các if
chức năng -containing, chỉ khi bạn gọi nó.
Shell không có khái niệm về declaring
chức năng. Vì vậy, bạn không thể có một tuyên bố chuyển tiếp.
Kết quả là, bạn cần phải thực hiện chức năng đọc bởi shell trước khi nó có thể được gọi.
autoload f
khai báo hàm, nhưng phần thân của nó chỉ được tải khi gọi lần đầu tiên). Điều đó không áp dụng cho OP bash
mặc dù.