Fonctions Bash et variables locales

Contenu

Cet article montrera comment les fonctions de variables locales sont utilisées et créées dans Bash. La création de fonctions bash vous permet de rendre votre code plus structurel, et les variables locales contribuent à la sécurité et évitent les erreurs de codage. Plonger!

Quels sont Fonctions Bash?

De la même manière que les autres langages de codage, Bash vous permet de créer des fonctions à partir de votre code ou script. Un rôle peut être défini pour effectuer une tâche spécifique, ou un ensemble de tâches, et vous pouvez facilement et rapidement appeler à partir de votre code principal simplement en utilisant le nom donné à la fonction.

Vous pouvez également imbriquer des appels de fonction (appel d’une fonction à partir d’une autre fonction), utiliser des variables locales dans la fonction et même passer des variables d’avant en arrière avec des fonctions, ou par l’utilisation de variables globales. Explorons.

Fonction de frappe simple

Nous définissons une test.sh avec notre éditeur de texte, de la manière suivante:

#!/bin/bash

welcome(){
écho "Bienvenue"
}

Bienvenue

Plus tard, nous rendons ce fichier exécutable en ajoutant l’exécution (x) et exécutez le script:

chmod +x test.sh
./test.sh

Une fonction Bash simple

Nous pouvons voir comment le script définit d’abord un welcome() fonction utilisant les idiomes Bash function_name(), et {} wrappers de fonction. En conclusion, nous appelons la fonction welcome simplement en utilisant son nom, welcome.

Lorsque le script est exécuté, ce qui se passe en arrière-plan, c’est que la définition de la fonction est notée, mais omis (En d'autres termes, ne s’exécute pas), jusqu’à ce que l’appel de fonction descende un peu plus bas. welcome est battu, et à quel moment l’interprète Bash effectue le welcome et retourne à la ligne directement après l’appel de fonction, ce qui pour ce cas est la fin de notre script.

Transmission de variables aux fonctions Bash

Nous définissons une test2.sh avec notre éditeur de texte préféré (nous;), de la manière suivante:

#!/bin/bash

if [ -avec "${1}" ]; then 
  echo "Une option requise!"
  sortir 1
fi

func1(){
  écho "${1}"
}

func2(){
  écho "${2} ${1}"
}

func1 "${1}"
func2 "une" "b"

Encore une fois, nous rendons notre script exécutable en utilisant chmod +x test2.sh et exécutez la même chose.

Une fonction Bash plus avancée avec un pas variable

Le résultat obtenu peut sembler intéressant voire déroutant au premier abord.. Malgré cela, c'est logique et facile à suivre. La première option passée au script sera, à l'échelle mondiale, disponible à partir de code comme ${1}, sauf fonctions internes, où ${1} devient le premier paramètre passé à la fonction, ${2} le deuxième, etc.

Autrement dit, le Global ${1} variable (la première option passée au script à partir de la ligne de commande) non activé depuis les fonctions, où le sens du ${1} La variable passe à la première option passée à la fonction. Pensez à la hiérarchie ou pensez à la façon dont une fonction pourrait présenter un petit script par elle-même et cela aura bientôt du sens.

En remarque, il peut aussi être utilisé $1 au lieu de ${1}, mais je recommande fortement aux programmeurs bash en herbe de toujours entourer les noms de variables de { et }.

La raison en est que parfois, lors de l'utilisation de variables dans une chaîne, par exemple, l'interprète bash ne peut pas regarder où une variable se termine et une partie du texte joint peut être considérée comme faisant partie du nom de la variable là où elle n'est pas, qui génère une sortie inattendue. C'est aussi plus propre et plus clair quelle est l'intention, surtout quand il s'agit de tableaux et d'indicateurs alternatifs spéciaux.

Pourtant, nous avons commencé notre programme avec le ${1} variable définie sur "first". Si vous regardez la vocation de func1, vous verrez que nous passons cette variable à la fonction, alors le ${1} à l'intérieur de la fonction devient ce qui était dans le ${1} du programme, En d'autres termes "first", et c'est pourquoi la première ligne de sortie est en fait first.

Ensuite, nous appelons func2 et nous avons passé deux fils "a" et "b" à la fonction. Ceux-ci deviennent plus tard les ${1} et ${2} automatiquement dans le func2 fonction. Fonction intérieure, nous les imprimons à l'envers, et notre sortie correspond très bien avec b a comme deuxième ligne de départ.

En conclusion, nous effectuons également une vérification en haut de notre script qui garantit qu'une option est vraiment transmise au test2.sh script vérifiant si "${1}" est vide ou n'utilise pas le -z tester dans if commander. Nous sortons du script avec un code de sortie différent de zéro (exit 1) pour indiquer aux programmes appelants que quelque chose s'est mal passé.

Variables locales et valeurs de retour

Pour notre dernier exemple, nous définissons un script test3.sh de la manière suivante:

#!/bin/bash

func3(){
  local REVERSE="$(écho "${1}" | tour)"
  écho "${INVERSE}"
}

ENTRÉE="abc"
INVERSE="$(func3 "${ENTRÉE}")"
écho "${INVERSE}"

Encore une fois, nous le rendons exécutable et exécutons le script. La sortie est cba comme vous pouvez vous y attendre en scannant le code et en écrivant les noms des variables, etc.

Exemple avec des variables locales et des valeurs de retour

Malgré cela, le code est complexe et demande un peu de temps pour s’y habituer. Explorons.

Premier, nous définissons une fonction func3 dans lequel nous créons une variable locale appelée REVERSE. On lui attribue une valeur en appelant une sous-couche ($()), et à partir de cette sous-couche, nous faisons écho à ce qui a été passé à la fonction (${1}) et canaliser cette sortie vers rev commander.

Les rev La commande imprime l'entrée reçue du tuyau (d'une autre manière) à l'envers. Il est également intéressant de noter ici que la ${1} La variable reste dans le sous-shell! Il est adopté intégralement.

Ensuite, encore de l'intérieur func3 fonction, nous imprimons la sortie. Malgré cela, cette sortie ne sera pas envoyée à l'écran, à la place, il sera capturé par notre appel de fonction et, pour cela, stocké dans le 'global’ REVERSE variable.

Nous établissons notre entrée en "abc", Appeler pour func3 retravailler à partir d'une sous-couche, passer le INPUT variable, et affecter la sortie à REVERSE variable. Notez qu'il n'y a absolument aucun lien entre le 'global’ REVERSE variable et local REVERSE variable dentro del script.

Alors que toute variable globale, y compris tout MARCHE EN ARRIÈRE il sera passé à la fonction, dès qu'une variable locale de même nom est définie, la variable locale sera utilisée. On peut aussi essayer de voir cet autre petit script test4.sh:

#!/bin/bash

func3(){
  local REVERSE="$(écho "${1}" | tour)"
  écho "${INVERSE}"
}

ENTRÉE="abc"
INVERSE="test"
func3 "${ENTRÉE}"
écho "${INVERSE}"

Exemple de fonction bash et de variable locale qui illustrent deux des points d'apprentissage vus jusqu'à présent

Quand tu cours, la sortie est cba et test. Les cba est cette fois généré par le même echo "${REVERSE}" dans func3 fonction, mais cette fois, il est émis directement au lieu d'être capturé dans le code ci-dessous comme le func3 "${INPUT}" La fonction n'est pas appelée depuis une sous-couche.

Ce script met en évidence deux points d'apprentissage que nous avons traités précédemment: en premier lieu, Quoi, même lorsque nous avons établi le REVERSE une variable "test" dans le script avant d'appeler le func3 fonction – qu'il local variable REVERSE Prenez le contrôle et utilisez-le à la place 'global’ une.

En second lieu, que notre 'global’ REVERSE la variable conserve sa valeur même s'il y a eu un local variable du même nom utilisée depuis la fonction appelée func3.

Fin

Comme tu peux le voir, les fonctions bash, passer des variables, ainsi que l'utilisation de variables locales et semi-globales rendent le langage de script Bash polyvalent, facile à coder et vous donne la possibilité d'établir un code bien structuré.

De plus, il est à noter ici que, tout en améliorant la lisibilité du code et la facilité d'utilisation, l'utilisation de variables locales offre une sécurité supplémentaire, puisque les variables ne seront pas accessibles en dehors du contexte d'une fonction, etc. Profitez des variables et des fonctions locales tout en codant dans Bash !!

Si vous souhaitez en savoir plus sur Bash, voir Comment analyser correctement les noms de fichiers dans Bash et Utiliser xargs en combinaison avec bash -c pour créer des commandes complexes.

Abonnez-vous à notre newsletter

Nous ne vous enverrons pas de courrier SPAM. Nous le détestons autant que vous.