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:
-f
limita lazione o la visualizzazione ai nomi e alle definizioni delle funzioni
-F
limita la visualizzazione solo ai nomi delle funzioni (più il numero di riga e il file di origine durante il debug)
-g
crea variabili globali quando vengono utilizzate in una funzione di shell; altrimenti ignorato
-p
visualizza gli attributi e il valore di ogni NOME
Opzioni che impostano gli attributi:
-a
per creare array indicizzati da NAME (se supportati)
-A
per creare array associativi di NAME (se supportati)
-i
per fare in modo che i NOMI abbiano lattributo “intero”
-l
per convertire i NOMI in minuscolo durante il compito
-n
rende NAME un riferimento alla variabile denominata dal suo valore
-r
per rendere NAME solo
-t
per fare in modo che i NOMI abbiano ” attributo trace “
-u
per convertire i NAME in lettere maiuscole durante il compito
-x
per 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,
declare
rende 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
,local
edeclare
è la più compatibile con altre shell? - @ 0xc0de
export
esiste in tutte le varianti dish
.local
esiste solo in bash e zsh,declare
solo in bash.typeset
esiste in ksh, bash e zsh.
declare
rende NAME locali, come con il comandolocal
. Lopzione-g
sopprime questo comportamento. Vederehelp declare
.declare
rende possibile creare array associativi, interi e read- solo variabili. Inoltre, espande i suoi argomenti, quindi cose comedeclare $name=1
sono possibili.