Î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:
-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 comenziilocal
. 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
șideclare
este cea mai compatibilă cu alte cochilii? - @ 0xc0de
export
există în toate variantelesh
.local
există numai în bash și zsh,declare
numai în bash.typeset
există în ksh, bash și zsh.
declare
face NAME-uri locale, ca și în cazul comenziilocal
. Opțiunea-g
suprimă acest comportament. Vedețihelp 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 precumdeclare $name=1
sunt posibile.