Как и другие говорили, вы не можете этого сделать.
Но если вы хотите расположить код в одном файле так, чтобы основная программа находилась вверху файла, а другие функции были определены ниже, вы можете сделать это с помощью отдельной 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
функции.источник
Нет, функции должны быть объявлены до их использования. Скрипты оболочки читаются построчно и обрабатываются построчно; поэтому функция не существует до тех пор, пока не будет выполнено ее объявление.
источник
C
нем комфортно.. yourfile
).if
операторов вне функции. Функция не должна быть определена , когда вы объявить оif
функции отработанной, только когда вы звоните его.Оболочка не имеет понятия
declaring
функции. Таким образом, вы не можете иметь предварительную декларацию.Как следствие, вам нужно, чтобы оболочка прочитала реализацию функции, прежде чем ее можно будет вызвать.
источник
autoload f
объявляется функция, но ее тело загружается только при первом вызове). Это не относится к ОП,bash
хотя.