Définition de variable dans bash à l'aide du mot-clé local

33

J'apprends le script bash et je l'ai trouvé sur mon / usr / share / bash-complètement, ligne 305:

local cword words=()

Qu'est ce que ça fait? Tous les tutoriels en ligne sont juste au format

local var=value
Alexandre Santos
la source

Réponses:

92

Bien que j'aime la réponse donnée par jordanm, je pense qu'il est tout aussi important de montrer aux Linuxutilisateurs moins expérimentés comment faire face à ces questions par eux-mêmes.

La méthode suggérée est plus rapide et plus polyvalente que la recherche de réponses sur des pages aléatoires apparaissant sur la page de résultats de recherche Google.

Tout d'abord, toutes les commandes qui peuvent être exécutées Bashsans taper un chemin explicite vers celui-ci, comme celles qui ./commandpeuvent être divisées en deux catégories: Bash shell builtinset external commands. Bash shell builtinssont installés avec Bashet en font partie alors qu'ils external commandsn'en font pas partie Bash. Ceci est important car ils Bash shell builtinssont documentés à l'intérieur man bashet leur documentation peut également être invoquée avec une helpcommande alors qu'ils external commandssont généralement documentés par eux-mêmes manpagesou prennent un roi de -h, --helpdrapeau. Pour vérifier si une commande est un Bash shell builtinou un external command:

$ type local
local is a shell builtin

Il affichera how command would be interpreted if used as a command name(à partir de help type). Ici, nous pouvons voir que localc'est un shell builtin. Voyons un autre exemple:

$ type vim
vim is /usr/bin/vim

Ici, nous pouvons voir que ce vimn'est pas une shell builtinmais une commande externe située dans /usr/bin/vim. Cependant, parfois la même commande peut être installée à la fois en tant que an external commandet être shell builtinen même temps. Ajouter -aà la typeliste toutes les possibilités, par exemple:

$ type -a echo
echo is a shell builtin
echo is /usr/bin/echo
echo is /bin/echo

Ici, nous pouvons voir que echoc'est à la fois un shell builtinet un external command. Cependant, si vous venez de taper echoet d'appuyer sur, Returnun shell builtinsera appelé car il apparaît en premier sur cette liste. Notez que toutes ces versions de echon'ont pas besoin d'être identiques. Par exemple, sur mon système /usr/bin/echoprend le --helpdrapeau tandis que builtinnon.

Ok, maintenant quand nous savons que localc'est un shell intégré, découvrons comment cela fonctionne:

$ help local
local: local [option] name[=value] ...
Define local variables.

Create a local variable called NAME, and give it VALUE.  OPTION can
be any option accepted by `declare'.

Local variables can only be used within a function; they are visible
only to the function where they are defined and its children.

Exit Status:
Returns success unless an invalid option is supplied, an error occurs,
or the shell is not executing a function.

Notez la première ligne: name[=value]. Tout entre [et ]est facultatif . C'est une convention commune utilisée dans de nombreuses manpagesformes de documentation dans le *nixmonde. Cela étant dit, l'ordre que vous avez demandé dans votre question est parfaitement légal. À son tour, le ...caractère signifie que l'argument précédent peut être répété. Vous pouvez également lire sur cette convention dans certaines versions de man man:

The following conventions apply to the SYNOPSIS section and can be used
as a guide in other sections.

bold text          type exactly as shown.
italic text        replace with appropriate argument.
[-abc]             any or all arguments within [ ] are optional.
-a|-b              options delimited by | cannot be used together.
argument ...       argument is repeatable.
[expression] ...   entire expression within [ ] is repeatable.

Donc, à la fin de la journée, j'espère que vous aurez maintenant plus de facilité à comprendre le fonctionnement des différentes commandes Linux.

Arkadiusz Drabczyk
la source
5
Très belle réponse. Je le lisais en espérant que vous aborderiez comment un débutant pourrait découvrir par lui-même quelle était l'affectation du tableau, juste à partir du code var=(), mais je suppose que c'est un peu difficile à comprendre sans même savoir le nom de ce que vous cherchez . ;)
Caractère générique
Prise en charge des obus non bash local ?
palswim
2
Je me suis connecté juste pour que je puisse voter positivement :)
Harendra Singh
@Wildcard Puisque le tableau est une syntaxe bash par opposition à une commande, vous pouvez le trouver défini dans man bash. Une fois là-dedans, tapez /Arrays$pour passer à la section sur les tableaux. (La fin $après Arraysest pour éviter de parcourir les références textuelles à la section.) De là, vous pouvez taper fpour avancer d'une page ou bpour revenir en arrière. Tapez qpour quitter la page de manuel lorsque vous avez terminé.
Taylor Edmiston
En outre, l'exécution helpsans arguments affichera la liste de toutes les commandes bash si vous êtes curieux d'en voir plus.
Taylor Edmiston
29

Le localmot-clé peut prendre plusieurs variables. Fournir une valeur à la variable est facultatif. Votre exemple déclare deux variables cwordet words. La wordsvariable se voit attribuer un tableau vide.

jordanm
la source
18

localdéclare simplement qu'une variable n'a de portée que dans la fonction actuellement définie, de sorte que l'environnement d'exécution principal ne peut pas "voir" la valeur. Vous ne pouvez pas utiliser en localdehors d'une fonction. Exemple

func() {
   nonlocal="Non local variable"
   local onlyhere="Local variable"
}
func
echo $nonlocal 
echo $onlyhere

Sortie: variable non locale

Donc, $onlyheren'était pas visible en dehors de la portée de la fonction.

Otheus
la source
Cette réponse donne plus de sens à ceux qui ont besoin d'une compréhension rapide.
Alex Raj Kaliamoorthy