Відповіді:
Як уже говорили інші, ви не можете цього зробити.
Але якщо ви хочете впорядкувати код в одному файлі так, щоб основна програма знаходилася вгорі файлу, а інші функції були визначені нижче, ви можете це зробити, маючи окрему 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
повернення. (див. Як прочитати весь скрипт оболонки перед його виконанням? )
[[ ${BASH_SOURCE[0]} = "$0" ]] && Main "$@"
для виклику основної функції, щоб я міг джерело її в іншому сценарії без Main
виконання. Тоді я можу або повторно використовувати функції, або написати тести, щоб перевірити їх.
main "$@"; exit
(з exit
тим самим рядком, що і main
) також є корисним захистом від модифікованого файлу під час його інтерпретації.
exit
цей же рядок, як main
ми впевнені, що оболонка не поверне нічого з файлу після main
повернення.
main; exit
, main; exit $?
або main <EOF>
, у всіх випадках, код main
виходу із сценарію використовується. Це exit
було б просто для того, щоб не заплутатися, якщо хтось редагує сценарій під час його запуску.
Ні, функції повинні існувати в середовищі оболонок під час виклику.
"Посібник зі стилів оболонки Google " має виправлення цього:
Функція, що викликається
main
, потрібна для сценаріїв, досить довгих, щоб містити принаймні одну функцію.
Зрештою, сценарій, після всіх функцій, як єдиний вислів, який не є функцією, у вас був би
main "$@"
Це викликало б main
функцію з будь-якими параметрами сценарію. main
Функція може бути розташована у верхній частині сценарію (керівництво стилю говорить покласти його на дні, але знову ж , це говорить багато).
Коли оболонка потрапляє на main
виклик, всі функції скрипту були проаналізовані, і тому їх можна викликати всередині main
функції.
Ні, функції повинні бути оголошені перед їх використанням. Сценарії оболонок читаються по черзі та діють по черзі за рядком; тому функція не існує, поки її декларація не буде виконана.
C
ньому комфортно.
. yourfile
).
if
заяв поза функцією. Функцію не потрібно визначати, коли ви оголошуєтеif
функцію, що містить, як тільки ви її викликаєте .
Оболонка не має поняття declaring
функції. Таким чином, ви не можете мати прямої заяви.
Як наслідок, вам потрібно мати функцію реалізації функції, прочитану оболонкою, перш ніж її можна буде викликати.
autoload f
декларується функція, але її тіло завантажується лише при першому виклику). Це не стосується ОП bash
.