Nello scripting bash:
creiamo la variabile semplicemente nominandola:
abc=ok
oppure possiamo usare declare
declare abc=ok
qual è la differenza?
e perché bash crea così tanti modi per creare una variabile?
Commenti
Risposta
Da help -m declare:
NOME
declare– Imposta valori e attributi delle variabili.SINOSSI
declare[-aAfFgilnrtux] [-p] [name[=value] …]DESCRIZIONE
Imposta valori e attributi delle variabili.
Dichiara le variabili e dare loro attributi. Se non viene fornito alcun NOME, visualizza gli attributi e i valori di tutte le variabili.
Opzioni:
-flimita lazione o la visualizzazione ai nomi e alle definizioni delle funzioni
-Flimita la visualizzazione solo ai nomi delle funzioni (più il numero di riga e il file di origine durante il debug)
-gcrea variabili globali quando vengono utilizzate in una funzione di shell; altrimenti ignorato
-pvisualizza gli attributi e il valore di ogni NOME
Opzioni che impostano gli attributi:
-aper creare array indicizzati da NAME (se supportati)
-Aper creare array associativi di NAME (se supportati)
-iper fare in modo che i NOMI abbiano lattributo “intero”
-lper convertire i NOMI in minuscolo durante il compito
-nrende NAME un riferimento alla variabile denominata dal suo valore
-rper rendere NAME solo
-tper fare in modo che i NOMI abbiano ” attributo trace “
-uper convertire i NAME in lettere maiuscole durante il compito
-xper creare NAME esporta
utilizzando “
+“invece di”-“disattiva lattributo specificato .Le variabili con lattributo intero hanno una valutazione aritmetica (vedere il comando
let) eseguita quando alla variabile viene assegnato un valore.Quando utilizzato in una funzione,
declarerende NAME locale, come con il comandolocal. Lopzione “-g” sopprime questo comportamento.Stato di uscita:
restituisce esito positivo a meno che non venga fornita unopzione non valida o si verifichi un errore di assegnazione della variabile.VEDI ANCHE
bash (1)
IMPLEMENTAZIONE
GNU bash, versione 4.3.11 (1) -release (i686-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
Licenza GPLv3 +: GNU GPL versione 3 o versioni successive < http : //gnu.org/licenses/gpl.html >
Quindi, declare viene utilizzato per impostare i valori delle variabili e gli attributi .
Vorrei mostrare luso di due attributi con un esempio molto semplice:
$ # First Example: $ declare -r abc=ok $ echo $abc ok $ abc=not-ok bash: abc: readonly variable $ # Second Example: $ declare -i x=10 $ echo $x 10 $ x=ok $ echo $x 0 $ x=15 $ echo $x 15 $ x=15+5 $ echo $x 20
Dallesempio precedente, penso che dovresti capire luso di declare variabile rispetto alla variabile normale! Questo tipo di azione declare è utile nelle funzioni, nei cicli con script.
Visita anche Variabili di digitazione: declare o impaginato
Commenti
- sì, " e attributi " è il punto! questa è la differenza.
- Fantastico! Amo gli esempi, il modo migliore per insegnare / imparare. Grazie!
- Devi sapere quali sono gli " attributi " per comprendere questa risposta. ' re proprietà della variabile come ' intero ', ' array ' o ' readonly '.
- Questo fa un buon lavoro di spiegazione di declare, ma ignora completamente ciò che accade quando dichiari semplicemente una variabile tramite bash.
Answer
abc=ok assegna un valore alla variabile abc. declare abc dichiara una variabile chiamata abc. I due possono essere combinati come declare abc=ok.
In bash, come altre shell, le variabili stringa e array non devono essere dichiarate, quindi declare non è necessario a meno che tu non voglia passare opzioni, ad es. declare -A abc per rendere abc un array associativo o declare -r per rendere una variabile di sola lettura. Tuttavia, allinterno di una funzione, declare fa la differenza: fa sì che la variabile sia locale rispetto alla funzione, il che significa che il valore della variabile al di fuori della funzione (se presente) viene preservato . (A meno che tu non utilizzi declare -g, che rende la variabile non locale; questo è utile se combinato con altre opzioni, ad esempio declare -gA per creare un array associativo in una funzione.) Esempio:
f () { declare a a="a in f" b="b in f" echo "From f: a is $a" echo "From f: b is $b" } a="Initial a" b="Initial b" f echo "After f: a is $a" echo "After f: b is $b"
Risultato:
From f: a is a in f From f: b is b in f After f: a is Initial a After f: b is b in f
Un altro cosa che puoi fare con il declare integrato è
Il declare integrato è unico per bash. È fortemente ispirato e molto vicino a ksh “s typeset integrato e bash fornisce typeset come sinonimo di declare per compatibilità. (Non so perché bash non lo abbia chiamato semplicemente typeset). Cè “un terzo sinonimo, local. Cè anche export, che è uguale a declare -x, ancora una volta per compatibilità (con ogni shell in stile Bourne).
Commenti
- sì! il punto è ' e lopzione '. p.s. se progetto la bash, lascerò che il comportamento di " declare " faccia qualcosa in condizioni diverse. questo rende le cose semplici.
- Bella risposta. Unaltra domanda, quale tra
export,localedeclareè la più compatibile con altre shell? - @ 0xc0de
exportesiste in tutte le varianti dish.localesiste solo in bash e zsh,declaresolo in bash.typesetesiste in ksh, bash e zsh.
declarerende NAME locali, come con il comandolocal. Lopzione-gsopprime questo comportamento. Vederehelp declare.declarerende possibile creare array associativi, interi e read- solo variabili. Inoltre, espande i suoi argomenti, quindi cose comedeclare $name=1sono possibili.