Î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
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:
-frestricționează acțiunea sau afișarea la numele funcțiilor și definiții
-Frestricționează afișarea numai la numele funcțiilor (plus numărul de linie și fișierul sursă la depanare)
-gcreați variabile globale atunci când sunt utilizate într-o funcție shell; altfel ignorat
-pafișează atributele și valoarea pentru fiecare NUME
Opțiuni care setează atribute:
-apentru a face matrice indexate NAME (dacă sunt acceptate)
-Apentru a face matrice asociative NAME (dacă sunt acceptate)
-ipentru a face NUMELE să aibă atributul „întreg”
-lpentru a converti NAME în minuscule la atribuire
-nfaceți din NAME o referință la variabila denumită după valoarea sa
-rpentru a face NAME re numai
-tpentru a face NUMELE să aibă „ atribut trace
-upentru a converti NUMELE în majuscule la atribuire
-xpentru 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,
declareface NAME-uri locale, ca și în cazul comenziilocal. Opțiunea „-gsuprimă 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șideclareeste cea mai compatibilă cu alte cochilii? - @ 0xc0de
exportexistă în toate variantelesh.localexistă numai în bash și zsh,declarenumai în bash.typesetexistă în ksh, bash și zsh.
declareface NAME-uri locale, ca și în cazul comenziilocal. Opțiunea-gsuprimă acest comportament. Vedețihelp declare.declareface posibilă crearea de matrici asociative, de numere întregi și de citire- numai variabile. De asemenea, își extinde argumentele, astfel încât lucruri precumdeclare $name=1sunt posibile.