Nello scripting bash, che cosa ' è la differenza tra declare e una variabile normale?

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

  • Quando viene utilizzato in una funzione, declare rende NAME locali, come con il comando local. Lopzione -g sopprime questo comportamento. Vedere help declare.
  • declare rende possibile creare array associativi, interi e read- solo variabili. Inoltre, espande i suoi argomenti, quindi cose come declare $name=1 sono possibili.

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 comando local. 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 e declare è la più compatibile con altre shell?
  • @ 0xc0de export esiste in tutte le varianti di sh. local esiste solo in bash e zsh, declare solo in bash. typeset esiste in ksh, bash e zsh.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *