Відповіді:
Як уже говорили інші, ви не можете цього зробити.
Але якщо ви хочете впорядкувати код в одному файлі так, щоб основна програма знаходилася вгорі файлу, а інші функції були визначені нижче, ви можете це зробити, маючи окрему 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.