Nello script bash, qual è la differenza tra dichiarare e una variabile normale?


43

In bash scripting:

creiamo variabili semplicemente nominandola:

abc=ok

o possiamo usare declare

declare abc=ok

qual è la differenza?

e perché bash crea così tanti modi per creare una variabile?


6
Se utilizzato in una funzione, declarerende NAME locali, come con il localcomando. L' -gopzione sopprime questo comportamento. Vedere help declare.
Ciro

2
declarerende possibile la creazione di matrici associative, numeri interi e variabili di sola lettura. Inoltre, espande i suoi argomenti, quindi cose come declare $name=1sono possibili.
Choroba,

Risposte:


34

Da help -m declare:

NOME

    declare - Imposta valori e attributi variabili.

SINOSSI

    declare[ -aAfFgilnrtux] [ -p] [ name[ ] ...]=value

DESCRIZIONE

    Imposta valori e attributi variabili.

    Dichiarare le variabili e dare loro gli attributi. Se non viene fornito alcun NAME, visualizzare gli attributi e i valori di tutte le variabili.

    Opzioni:

      -f
        limitare l'azione 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 sorgente durante il debug)
      -g
        creare variabili globali quando usato in una funzione shell; altrimenti ignorato
      -p
        visualizza gli attributi e il valore di ciascun NOME

    Opzioni che impostano gli attributi:

      -a
        rendere array indicizzati NAME (se supportati)
      -A
        creare array associativi di NAME (se supportati)
      -i
        per fare in modo che NAME abbia l'attributo 'intero'
      -l
        per convertire NAME in lettere minuscole al momento dell'assegnazione
      -n
        fai di NAME un riferimento alla variabile indicata dal suo valore
      -r
        per rendere NAME di sola lettura
      -t
        per fare in modo che NAME abbia l'attributo 'trace'
      -u
        per convertire i NOME in maiuscolo durante l'assegnazione
      -x
        per esportare NAME

    L'uso di ' +' anziché ' -' disattiva l'attributo indicato.

    Le variabili con l'attributo intero hanno una valutazione aritmetica (vedere il letcomando) eseguita quando alla variabile viene assegnato un valore.

    Se utilizzato in una funzione, declarerende NAME locali, come con il local comando. L' -gopzione " " elimina questo comportamento.

    Exit Status:
    restituisce esito positivo a meno che non venga fornita un'opzione non valida o si verifichi un errore di assegnazione variabile.

GUARDA 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 successiva <http://gnu.org/ licenze / gpl.html>


Quindi, declareviene utilizzato per impostare valori e attributi variabili .

Permettetemi di mostrare l'uso 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

Dall'esempio sopra, penso che dovresti capire l'uso della declarevariabile rispetto alla variabile normale! Questo tipo di declareazione è utile in funzioni, cicli con script.

Visita anche Digitare variabili: dichiarare o comporre


sì, "e gli attributi" è il punto! questa è la differenza
Prole ama l'

Grande! Adoro gli esempi, il modo migliore per insegnare / imparare. Grazie!
turkenh,

1
Devi sapere quali "attributi" sono per comprendere questa risposta. Sono proprietà della variabile come 'integer', 'array' o 'readonly'.
Noumenon,

11

abc=okassegna un valore alla variabile abc. declare abcdichiara una variabile chiamata abc. I due possono essere combinati come declare abc=ok.

In bash, come altre shell, non è necessario dichiarare le variabili stringa e matrice, quindi declarenon è necessario a meno che non si desideri passare opzioni, ad esempio declare -A abcper creare abcuna matrice associativa o declare -rper rendere una variabile di sola lettura. Tuttavia, all'interno di una funzione, declarefa la differenza: fa sì che la variabile sia locale alla funzione, il che significa che il valore della variabile esterna alla funzione (se presente) viene conservato. (A meno che non si usi declare -g, il che rende la variabile non locale; questo è utile quando combinato con altre opzioni, ad esempio declare -gAper creare un array associativo globale 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"

Produzione:

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'altra cosa che puoi fare con il declarebuiltin è

Il declarebuiltin è unico per bash. È fortemente ispirato e molto vicino al typesetbuiltin di ksh , e bash fornisce typesetsinonimo di declarecompatibilità. (Non so perché bash non si limitasse a chiamarlo typeset). C'è una terza sinonimo local. C'è anche export, che è lo stesso declare -x, di nuovo per compatibilità (con ogni shell in stile Bourne).


sì! l'opzione "e" è il punto. ps se progetto la bash, lascerò che il comportamento di "dichiarare" faccia qualcosa in condizioni diverse. questo semplifica le cose.
Prole ama l'

Bella risposta. Un'ulteriore domanda, quale tra export, localed declareè la più compatibile con altre shell?
0xc0de,

1
@ 0xc0de exportesiste in tutte le varianti di sh. localesiste solo in bash e zsh, declaresolo in bash. typesetesiste in ksh, bash e zsh.
Gilles 'SO- smetti di essere malvagio' il
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.