În scripturile bash, care este ' diferența dintre declare și o variabilă normală?

În scriptarea bash:

creăm o variabilă doar numindu-o:

abc=ok 

sau putem folosi declare

declare abc=ok 

care este diferența?

și de ce face bash atât de multe modalități de a crea o variabilă?

Comentarii

  • Când este utilizat într-o funcție, declare face NAME-uri locale, ca și în cazul comenzii local. Opțiunea -g suprimă acest comportament. Vedeți help declare.
  • declare face posibilă crearea de matrici asociative, de numere întregi și de citire- numai variabile. De asemenea, își extinde argumentele, astfel încât lucruri precum declare $name=1 sunt posibile.

Răspuns

From help -m declare:

NUME

    declare – Setați valori și atribute variabile.

SINOPSĂ

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

DESCRIERE

    Setați valorile variabilei și atributele.

    Declarați variabilele și să le dea atribute. Dacă nu sunt date NAME, afișați atributele și valorile tuturor variabilelor.

    Opțiuni:

      -f

        restricționează acțiunea sau afișarea la numele funcțiilor și definiții

      -F

        restricționează afișarea numai la numele funcțiilor (plus numărul de linie și fișierul sursă la depanare)

      -g

        creați variabile globale atunci când sunt utilizate într-o funcție shell; altfel ignorat

      -p

        afișează atributele și valoarea pentru fiecare NUME

    Opțiuni care setează atribute:

      -a

        pentru a face matrice indexate NAME (dacă sunt acceptate)

      -A

        pentru a face matrice asociative NAME (dacă sunt acceptate)

      -i

        pentru a face NUMELE să aibă atributul „întreg”

      -l

        pentru a converti NAME în minuscule la atribuire

      -n

        faceți din NAME o referință la variabila denumită după valoarea sa

      -r

        pentru a face NAME re numai

      -t

        pentru a face NUMELE să aibă „ atribut trace

      -u

        pentru a converti NUMELE în majuscule la atribuire

      -x

        pentru a face NUME export

    Folosind „ + în loc de - dezactivează atributul dat .

    Variabilele cu atributul întreg au evaluare aritmetică (vezi comanda let) efectuată atunci când variabilei i se atribuie o valoare.

    Când utilizat într-o funcție, declare face NAME-uri locale, ca și în cazul comenzii local. Opțiunea „ -g suprimă acest comportament.

    Stare ieșire:
    Returnează succesul, cu excepția cazului în care este furnizată o opțiune nevalidă sau apare o eroare de atribuire variabilă.

VEZI ȘI

    bash (1)

IMPLEMENTARE

    GNU bash, versiunea 4.3.11 (1) -release (i686-pc-linux-gnu)
    Copyright (C) 2013 Free Software Foundation, Inc.
    Licența GPLv3 +: GNU GPL versiunea 3 sau mai târziu < http : //gnu.org/licenses/gpl.html >


Deci, declare este utilizat pentru setarea valorilor variabile și a atributelor .

Permiteți-mi să arăt utilizarea a două atribute cu un exemplu foarte simplu:

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

Din exemplul de mai sus, cred că ar trebui să înțelegeți utilizarea declare variabilă peste variabilă normală! Acest tip de declare acțiune este util în funcții, bucle cu scripturi.

De asemenea, vizitați Variabile de tastare: declarați sau tipografiați

Comentarii

  • da, " și atribute " este punctul! aceasta este diferența.
  • Super! Îmi plac exemplele, cel mai bun mod de a preda / învăța. Mulțumim!
  • Trebuie să știți ce " sunt atributele " pentru a înțelege acest răspuns. Acestea ' re proprietăți ale variabilei precum ' întreg ', ' array ', sau ' readonly '.
  • Aceasta face o treabă frumoasă de a explica declare, dar ignoră complet ceea ce se întâmplă atunci când declarați pur și simplu o variabilă prin bash.

Răspuns

abc=ok atribuie o valoare variabilei abc. declare abc declară o variabilă numită abc. Cele două pot fi combinate ca declare abc=ok.

În bash, ca și alte shell-uri, variabilele șir și matrice nu trebuie declarate, deci declare nu este necesar decât dacă doriți să treceți opțiuni, de ex declare -A abc pentru a face din abc o matrice asociativă sau declare -r pentru a face o variabilă numai în citire. Cu toate acestea, în interiorul unei funcții, declare face diferența: face ca variabila să fie locală pentru funcție, ceea ce înseamnă că valoarea variabilei din afara funcției (dacă există) este păstrată . (Cu excepția cazului în care utilizați declare -g, ceea ce face ca variabila să nu fie locală; acest lucru este util atunci când este combinat cu alte opțiuni, de ex. declare -gA pentru a crea o matrice asociativă într-o funcție.) Exemplu:

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" 

Ieșire:

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 

Alt lucru pe care îl puteți face cu declare integrat este

declare integrat este unic pentru bash. Este „puternic inspirat și foarte apropiat de ksh” s typeset builtin, iar bash oferă typeset ca sinonim al declare pentru compatibilitate. (Nu știu de ce bash nu l-a numit typeset). Există „un al treilea sinonim, local. Există și export, care este același cu declare -x, din nou pentru compatibilitate (cu fiecare shell în stil Bourne).

Comentarii

  • da! ' și opțiunea ' este punctul. p.s. dacă proiectez bash-ul, voi permite ca comportamentul " să declare " să facă ceva în diferite condiții. acest lucru face lucrurile simple.
  • Răspuns frumos. O întrebare suplimentară, care dintre export, local și declare este cea mai compatibilă cu alte cochilii?
  • @ 0xc0de export există în toate variantele sh. local există numai în bash și zsh, declare numai în bash. typeset există în ksh, bash și zsh.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *