Réponses:
Comme d'autres l'ont dit, vous ne pouvez pas faire ça.
Mais si vous souhaitez organiser le code dans un fichier afin que le programme principal soit en haut du fichier et que d'autres fonctions soient définies ci-dessous, vous pouvez le faire en ayant une main
fonction distincte .
Par exemple
#!/bin/sh
main() {
if [ "$1" = yes ]; then
do_task_this
else
do_task_that
fi
}
do_task_this() {
...
}
do_task_that() {
...
}
main "$@"; exit
Lorsque nous appelons main
à la fin du fichier, toutes les fonctions sont déjà définies. Un passage explicite "$@"
à main
est requis pour rendre les arguments de ligne de commande du script visibles dans la fonction.
L'explicite exit
sur la même ligne que l'appel à main n'est pas obligatoire, mais peut être utilisé pour empêcher un script en cours d'exécution d'être gâché si le fichier de script est modifié. Sans cela, le shell essaierait de continuer à lire les commandes du fichier de script après les main
retours. (voir Comment lire l'intégralité du script shell avant de l'exécuter? )
[[ ${BASH_SOURCE[0]} = "$0" ]] && Main "$@"
pour appeler la fonction principale afin de pouvoir la source dans un autre script sans Main
être exécuté. Ensuite, je peux soit réutiliser les fonctions ou écrire des tests pour les vérifier.
main "$@"; exit
(avec exit
sur la même ligne que main
) est également utile comme protection contre la modification du fichier pendant son interprétation.
exit
sur la même ligne car main
nous nous assurons que le shell ne lira plus rien du fichier après les main
retours.
main; exit
, main; exit $?
ou main <EOF>
, dans tous les cas, le code de sortie de main
est utilisé comme code de sortie du script. Ce exit
serait juste pour empêcher les choses de se gâcher si quelqu'un modifie le script pendant qu'il est en cours d'exécution.
Non, les fonctions doivent exister dans l'environnement shell au moment de leur appel.
Le "Shell Style Guide" de Google propose un correctif:
Une fonction appelée
main
est requise pour les scripts suffisamment longs pour contenir au moins une autre fonction.
À la toute fin du script, après toutes les fonctions, comme la seule instruction qui ne se trouve pas dans une fonction, vous auriez
main "$@"
Cela appellerait la main
fonction avec tous les paramètres donnés au script. La main
fonction pourrait être située en haut du script (le guide de style dit de la mettre en bas, mais là encore, elle dit beaucoup de choses).
Lorsque le shell arrive à l' main
appel, toutes les fonctions du script ont été analysées et peuvent donc être appelées à partir de la main
fonction.
Non, les fonctions doivent être déclarées avant d'être utilisées. Les scripts shell sont lus ligne par ligne et agis ligne par ligne; donc une fonction n'existe pas tant que sa déclaration n'a pas été exécutée.
C
confortable.
. yourfile
).
if
instructions nues en dehors d'une fonction. La fonction n'a pas besoin d'être définie lorsque vous déclarez la if
fonction -containing, juste lorsque vous l' appelez .
Le shell n'a pas de concept de declaring
fonction. Vous ne pouvez donc pas avoir de déclaration à terme.
Par conséquent, vous devez faire lire l'implémentation de la fonction par le shell avant de pouvoir l'appeler.
autoload f
déclare la fonction, mais son corps n'est chargé qu'au premier appel). Cela ne s'applique cependant pas aux PO bash
.