Ответы:
Как и другие говорили, вы не можете этого сделать.
Но если вы хотите расположить код в одном файле так, чтобы основная программа находилась вверху файла, а другие функции были определены ниже, вы можете сделать это с помощью отдельной 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, не является обязательным, но может использоваться для предотвращения путаницы при запуске скрипта при изменении файла скрипта. Без него оболочка будет пытаться продолжить чтение команд из файла скрипта после 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
хотя.