J'essaie de rechercher comment passer des paramètres dans une fonction Bash, mais ce qui revient est toujours comment passer des paramètres à partir de la ligne de commande.
Je voudrais passer des paramètres dans mon script. J'ai essayé:
myBackupFunction("..", "...", "xx")
function myBackupFunction($directory, $options, $rootPassword) {
...
}
Mais la syntaxe n'est pas correcte, comment passer un paramètre à ma fonction?
bash
parameters
arguments
stivlo
la source
la source
Réponses:
Il existe deux façons typiques de déclarer une fonction. Je préfère la deuxième approche.
ou
Pour appeler une fonction avec des arguments:
La fonction fait référence aux arguments passés par leur position (pas par leur nom), c'est-à-dire $ 1, $ 2, etc. $ 0 est le nom du script lui-même.
Exemple:
De plus, vous devez appeler votre fonction après sa déclaration.
Production:
Référence: Advanced Bash-Scripting Guide .
la source
function name() {}
. Peut-être avec une entrée avant{}
function
mot - clé et le()
. Mon but (dans un fichier, pas la ligne de commande) est d'augmenter la clarté, pas réduire le nombre de caractères tapés, à savoir,function myBackupFunction() compound-statement
.function
version du mot clé est une extension; l'autre forme fonctionne dans tous les shells compatibles POSIX.function
mot - clé avait des garanties dans les anciens shells de la famille ksh qui l'introduisaient que bash moderne n'honore pas (dans de tels shells, lesfunction
variables étaient locales par défaut; dans bash , ce ne est pas). En tant que tel, son utilisation diminue la clarté pour quiconque connaît et pourrait s'attendre au comportement de ksh. Voir wiki.bash-hackers.org/scripting/obsoleteLa connaissance des langages de programmation de haut niveau (C / C ++ / Java / PHP / Python / Perl ...) suggérerait au profane que les fonctions bash devraient fonctionner comme elles le font dans ces autres langages. Au lieu de cela , les fonctions bash fonctionnent comme des commandes shell et s'attendent à ce que des arguments leur soient transmis de la même manière que l'on pourrait passer une option à une commande shell (par exemple
ls -l
). En effet, les arguments de fonction dans bash sont traités comme des paramètres positionnels ($1, $2..$9, ${10}, ${11}
, etc.). Ce n'est pas une surprise compte tenu dugetopts
fonctionnement. N'utilisez pas de parenthèses pour appeler une fonction dans bash.( Remarque : il se trouve que je travaille actuellement sur Open Solaris.)
Vous souhaitez utiliser des noms pour les variables. Faites ça.
Vous voulez passer un tableau à une fonction?
À l'intérieur de la fonction, gérez les arguments comme celui-ci.
Besoin de passer une valeur et un tableau, mais toujours utiliser "$ @" à l'intérieur de la fonction?
la source
Si vous préférez les paramètres nommés, il est possible (avec quelques astuces) de passer réellement des paramètres nommés aux fonctions (permet également de passer des tableaux et des références).
La méthode que j'ai développée vous permet de définir des paramètres nommés passés à une fonction comme celle-ci:
Vous pouvez également annoter des arguments comme @required ou @readonly, créer ... des arguments de repos, créer des tableaux à partir d'arguments séquentiels (en utilisant par exemple
string[4]
) et éventuellement lister les arguments sur plusieurs lignes:En d'autres termes, non seulement vous pouvez appeler vos paramètres par leurs noms (ce qui constitue un noyau plus lisible), vous pouvez en fait passer des tableaux (et des références à des variables - cette fonctionnalité ne fonctionne que dans bash 4.3 cependant)! De plus, les variables mappées sont toutes dans la portée locale, tout comme $ 1 (et autres).
Le code qui fait ce travail est assez léger et fonctionne à la fois en bash 3 et bash 4 (ce sont les seules versions avec lesquelles je l'ai testé). Si vous êtes intéressé par plus de trucs comme celui-ci qui rendent le développement avec bash beaucoup plus agréable et plus facile, vous pouvez jeter un œil à mon framework Bash Infinity , le code ci-dessous est disponible comme l'une de ses fonctionnalités.
la source
@var
,@reference
, les@params
variables? Que dois-je rechercher sur Internet pour en savoir plus à ce sujet?ucommon
et mon code. Il est possible que vous ayez installé un outil qui provoque le problème que vous avez mentionné, aucune idée de ce que cela pourrait être.Manquez les parens et les virgules:
et la fonction devrait ressembler à ceci:
la source
J'espère que cet exemple peut vous aider. Il prend deux nombres à l'utilisateur, les transmet à la fonction appelée
add
(dans la toute dernière ligne du code), etadd
les résume et les imprime.la source
Un exemple simple qui effacera à la fois lors de l'exécution du script ou à l'intérieur du script lors de l'appel d'une fonction.
la source
Je pensais que j'apporterais une mention d'une autre façon de passer des paramètres nommés à bash ... en passant par référence. Ceci est pris en charge à partir de bash 4.0
Une syntaxe alternative pour bash 4.3 utilise un nameref
Bien que le nameref soit beaucoup plus pratique en ce qu'il déréférence de manière transparente, certaines distributions plus anciennes sont toujours livrées avec une version plus ancienne, donc je ne le recommanderai pas encore tout à fait.
la source