Definizione della variabile in bash usando la parola chiave locale


33

Sto imparando lo scripting bash e l'ho trovato sul mio / usr / share / bash-completamento, linea 305:

local cword words=()

Che cosa fa? Tutti i tutorial online sono solo nel formato

local var=value

Risposte:


92

Sebbene mi piaccia la risposta data da Jordan, penso che sia altrettanto importante mostrare Linuxagli utenti meno esperti come affrontare tali domande da soli.

Il modo suggerito è più veloce e versatile rispetto alla ricerca di risposte a pagine casuali visualizzate nella pagina dei risultati di ricerca di Google.

Innanzitutto, tutti i comandi che possono essere eseguiti Bashsenza digitare un percorso esplicito come tale ./commandpossono essere divisi in due categorie: Bash shell builtinse external commands. Bash shell builtinsvieni installato Bashe ne fai parte mentre external commandsnon ne fanno parte Bash. Questo è importante perché Bash shell builtinssono documentati all'interno man bashe la loro documentazione può anche essere invocata con helpcomando mentre di external commandssolito sono documentati da soli manpageso prendono qualche re della -h, --helpbandiera. Per verificare se un comando è un Bash shell builtino un external command:

$ type local
local is a shell builtin

Verrà visualizzato how command would be interpreted if used as a command name(da help type). Qui possiamo vedere che localè un shell builtin. Vediamo un altro esempio:

$ type vim
vim is /usr/bin/vim

Qui possiamo vedere che vimnon è un shell builtinma un comando esterno situato in /usr/bin/vim. Tuttavia, a volte lo stesso comando può essere installato sia come sia external commandsia shell builtinallo stesso tempo. Aggiungi -aa typeper elencare tutte le possibilità, ad esempio:

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

Qui possiamo vedere che echoè sia a shell builtinche an external command. Tuttavia, se hai appena digitato echoe premuto Returnun shell builtinsarebbe chiamato perché appare prima in questo elenco. Nota che echonon è necessario che tutte queste versioni siano uguali. Ad esempio, sul mio sistema /usr/bin/echoprende --helpflag mentre a builtinno.

Ok, ora quando sappiamo che localè una shell integrata scopriamo come funziona:

$ 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.

Si noti la prima riga: name[=value]. Tutto tra [e ]è facoltativo . È una convenzione comune utilizzata in molti manpagese in forma di documentazione nel *nixmondo. Detto questo, il comando che hai chiesto nella tua domanda è perfettamente legale. A sua volta, ...carattere significa che l'argomento precedente può essere ripetuto. Puoi anche leggere questa convenzione in alcune versioni di 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.

Quindi, alla fine, spero che ora avrai un tempo più facile per capire come funzionano i diversi comandi Linux.


5
Risposta molto bella Lo stavo leggendo sperando che ti rivolgessi a come un principiante poteva scoprire da solo quale fosse l'assegnazione dell'array, solo dal codice var=(), ma suppongo che sia un po 'troppo da capire senza nemmeno sapere il nome di ciò che stai cercando . ;)
Wildcard il

Supportano anche shell non bash local?
Palswim,

2
Ho effettuato l'accesso solo per poter votare la tua risposta :)
Harendra Singh,

@Wildcard Poiché l'array è sintassi bash in contrapposizione a un comando, è possibile trovarlo definito in man bash. Una volta lì, digita /Arrays$per passare alla sezione sugli array. (Il $seguito Arraysè per evitare di scorrere i riferimenti nel testo alla sezione.) Da lì puoi digitare fper andare avanti di una pagina o bper tornare indietro. Digita qper uscire dalla pagina man quando hai finito.
Taylor Edmiston,

Inoltre, l'esecuzione helpsenza args elencherà tutti i builtin bash se sei curioso di vedere di più.
Taylor Edmiston,

29

La localparola chiave può accettare più variabili. Fornire un valore alla variabile è facoltativo. Il tuo esempio dichiara due variabili cworde words. Alla wordsvariabile è assegnato un array vuoto.


18

localdichiara semplicemente che una variabile ha ambito solo nella funzione attualmente definita, in modo che l'ambiente di esecuzione principale non possa "vedere" il valore. Non è possibile utilizzare localal di fuori di una funzione. Esempio

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

Output: variabile non locale

Quindi $onlyherenon era visibile al di fuori dell'ambito della funzione.


Questa risposta ha più senso chi ha bisogno di una rapida comprensione.
Alex Raj Kaliamoorthy,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.