Respuestas:
Como otros han dicho, no puedes hacer eso.
Pero si desea organizar el código en un archivo para que el programa principal esté en la parte superior del archivo, y otras funciones se definen a continuación, puede hacerlo teniendo una main
función separada .
P.ej
#!/bin/sh
main() {
if [ "$1" = yes ]; then
do_task_this
else
do_task_that
fi
}
do_task_this() {
...
}
do_task_that() {
...
}
main "$@"; exit
Cuando llamamos main
al final del archivo, todas las funciones ya están definidas. Se requiere pasar explícitamente "$@"
a main
para que los argumentos de la línea de comandos del script sean visibles en la función.
Lo explícito exit
en la misma línea que la llamada a main no es obligatorio, pero puede usarse para evitar que un script en ejecución se estropee si se modifica el archivo de script. Sin él, el shell intentaría continuar leyendo los comandos del archivo de script después de los main
retornos. (consulte ¿Cómo leer todo el script de shell antes de ejecutarlo? )
[[ ${BASH_SOURCE[0]} = "$0" ]] && Main "$@"
para llamar a la función principal para poder obtenerlo en otro script sin Main
ser ejecutado. Entonces puedo reutilizar las funciones o escribir pruebas para verificarlas.
main "$@"; exit
(con exit
en la misma línea que main
) también es útil como protección contra la modificación del archivo mientras se interpreta.
exit
en la misma línea ya que main
nos aseguramos de que el shell no volverá a leer nada del archivo después de main
regresar.
main; exit
, main; exit $?
o main <EOF>
, en todo caso, el código de salida main
se utiliza como el código de salida del script. Esto exit
sería solo para evitar que las cosas se estropeen si alguien edita el script mientras se está ejecutando.
No, las funciones tienen que existir en el entorno de shells al momento de llamarlas.
La "Guía de estilo de Shell" de Google tiene una solución para esto:
Se
main
requiere una función llamada para los scripts lo suficientemente largos como para contener al menos otra función.
Al final del script, después de todas las funciones, como la única declaración que no está en una función, tendría
main "$@"
Esto llamaría a la main
función con cualquier parámetro que se le haya dado al script. La main
función podría ubicarse en la parte superior de la secuencia de comandos (la guía de estilo dice ponerla en la parte inferior, pero, de nuevo, dice muchas cosas).
Cuando el shell llega a la main
llamada, todas las funciones en el script se han analizado y, por lo tanto, se pueden llamar desde la main
función.
No, las funciones deben declararse antes de ser utilizadas. Los scripts de shell se leen línea por línea y actúan línea por línea; entonces una función no existe hasta que su declaración ha sido ejecutada.
C
es cómodo.
. yourfile
).
if
declaraciones simples fuera de una función. La función no tiene que definirse cuando declara la if
función que contiene, solo cuando la llama .
El shell no tiene el concepto de declaring
una función. Por lo tanto, no puede tener una declaración adelantada.
Como consecuencia, debe tener la implementación de la función leída por el shell antes de que pueda ser invocada.
autoload f
declara la función, pero su cuerpo solo se carga en la primera invocación). Sin embargo, eso no se aplica a los OP bash
.