Ce este “ declara ” în Bash?

După ce am citit răspunsul lui ilkkachu la această întrebare am aflat despre existența declare (cu argumentul -n) shell încorporat.

help declare aduce:

Setați valorile variabilei și atributele.

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

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

I cereți o explicație generală cu un exemplu referitor la declare deoarece nu înțeleg man. Știu ce este o variabilă și o extind, dar totuși îmi lipsește man de pe declare (atribut variabil?).

Poate „doriți să explicați acest lucru pe baza codului de ilkkachu în răspuns:

#!/bin/bash function read_and_verify { read -p "Please enter value for "$1": " tmp1 read -p "Please repeat the value to verify: " tmp2 if [ "$tmp1" != "$tmp2" ]; then echo "Values unmatched. Please try again."; return 2 else declare -n ref="$1" ref=$tmp1 fi } 

Comentarii

Răspuns

În majoritatea cazurilor este suficient cu o declarație implicită în bash

asdf="some text" 

Dar, uneori, doriți ca valoarea unei variabile să fie numai întreagă (deci, în cazul în care s-ar schimba ulterior, chiar și automat, ar putea fi schimbată doar în un număr întreg, implicit la zero în unele cazuri) și poate utiliza:

declare -i num 

sau

declare -i num=15 

Uneori doriți tablouri și apoi aveți nevoie de declare

declare -a asdf # indexed type 

sau

Puteți găsi tutoriale bune despre tablouri în bash când navigați pe internet cu șirul de căutare„ tutorial bash array ”(fără ghilimele), pentru exemplu

linuxconfig.org/how-to-use-arrays-in-bash-script


Cred că acestea sunt cele mai frecvente cazuri când declarați variabile.


Vă rugăm să rețineți că

  • într-o funcție, declare face variabila locală (în funcție)
  • fără nici un nume, listează toate variabilele (în shell-ul activ)

    declare 

În cele din urmă, veți obține un scurt rezumat al caracteristicilor comenzii încorporate a shell-ului declare în bash cu comanda

help declare 

Comentarii

  • Bună ziua din OP! Cred că răspunsul dvs. este grozav și l-am votat în sus și vă mulțumesc pentru acest răspuns, după părerea mea, un răspuns foarte didactic. Tocmai am sugerat o editare minoră, care, după umila mea părere, o face și mai ușoară și mai accesibilă pentru cititorii nou-veniți vă rugăm să parcurgeți această sugestie.
  • Tocmai am văzut că user:muru a votat respingerea editării; vă rugăm să știți că eu și muru ” ne-am confruntat ” de mai multe ori în diferitele secțiuni ale acestui site web și presupun că respingerea lui nu este ‘ t obiectiv și este de fapt dăunător în contrast cu modificările directe prezentate în pagina de sugestie de editare aici: unix.stackexchange.com/review/suggested -edits / 325749
  • @JohnDoea, am văzut că și un alt utilizator v-a respins modificările. Cred că unele dintre modificările dvs. sunt bune, dar unele dintre ele vor schimba mesajul din ceea ce am intenționat, așa că nu mi-ar plăcea. Pot edita răspunsul pentru a include ceea ce cred că sunt editări bune.
  • vă mulțumesc; după cum probabil știți, respingerea modificărilor este mult mai frecventă în SE decât acceptarea lor (chiar și parțial); mulțumesc că mi-ați comunicat că un alt utilizator a respins editarea (nu l-am văzut ‘ înainte sincer) și că ați luat în considerare să introduc cel puțin unele dintre modificările mele la răspunsul dvs.; Respect atât de mult,

Răspuns

Rezultatul help declare este destul de concis. O explicație mai clară poate fi găsită în man bash sau info bash – acesta din urmă fiind sursa pentru ceea ce urmează.

În primul rând, câteva definiții. Despre variabile și atribute :

Un parametru este o entitate care stochează valori. … O variabilă este un parametru notat cu un name. O variabilă are o valoare și zero sau mai multe atribute . Atributele sunt atribuite utilizând comanda încorporată declare

Și despre declare builtin :

declare

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

Declarați variabilele și dați-le atribute. Dacă nu sunt date nume, afișați în schimb valorile variabilelor.

-n
Dați fiecare nume atributul nameref , făcându-l o referință de nume la o altă variabilă. Această altă variabilă este definită de valoarea nume . Toate referințele, atribuțiile și modificările atributelor la nume , cu excepția celor care utilizează sau modifică atributul -n, sunt efectuate pe variabila la care face referire valoarea numelui . …

Rețineți că variabilele referință nume sunt disponibile numai în Bash 4.3 sau o versiune ulterioară 1 .

De asemenea, pentru o introducere utilă la declare și atributele variabile din Bash, v-aș îndrepta spre răspundeți la ” Ce fac declare name și declare -g? ” (care se concentrează în principal pe domeniul variabilelor „, totuși).


Practic 2 , declare name=[value] este echivalent cu atribuirea name=[value] cu care probabil sunteți familiarizat. În ambele cazuri, name are atributul nul valoare dacă lipsește value.

Rețineți că declare name ușor diferit nu setează variabila name 3 :

 $ declare name ## With the -p option, declare is used to display ## attributes and values of variables $ declare -p name declare -- name ## "name" exists ## Parameter expansion can be used to reveal if a variable is set: ## "isunset" is substituted to "name" only if unset $ echo "${name-isunset}" isunset  

Astfel, variabila name poate fi:

  • declarat și dezactivat , după declare name;
  • declarat și set cu nul ca valoare, după name= sau declare name=;
  • declarat , set și cu o valoare non nul după name=value sau .

Mai general, declare [options] name=value

  1. creează variabila name – care este un parametru cu un nume, care la rândul său este doar o porțiune de memorie pe care o puteți utiliza pentru a stoca informații 4 ;
  2. atribuie valoarea value la aceasta;
  3. setează opțional atributele name „, care definesc atât tipul de valoare pe care îl poate stoca (nu în termeni de tip , strict vorbind, deoarece limbajul lui Bash nu este tastat) și modurile în care poate fi manipulat.

Atributele sunt probabil mai ușor de explicat cu un exemplu: utilizarea declare -i name va seta atributul ” întreg ” din name, lăsându-l să fie tratat ca un întreg; citând manual , ” evaluarea aritmetică va fi efectuată atunci când variabilei i se atribuie o valoare „:

 ## Let"s compare an ordinary variable with an integer $ declare var $ declare -i int $ var="1+1" $ int="1+1" $ echo "$var" 1+1 ## The literal "1+1" $ echo "$int" 2 ## The result of the evaluation of 1+1  

În lumina cele de mai sus, ceea ce se întâmplă în codul lui ilkkachu este că:

  1. Se declară o variabilă numită ref, cu ” nameref ” set de atribute, iar conținutul $1 (primul argument de poziție) este atribuit it:

     declare -n ref="$1"  

    Scopul unei variabile de referință de nume precum ref este de a păstra numele unei alte variabile, care, în general, nu ar fi cunoscută în prealabil, posibil pentru că dorim ca aceasta să fie definită dinamic (de ex. aplicate mai multor variabile) și la oferiți un mod convenabil de a face referire la (și manipularea) acestuia. (Totuși, nu este singurul: indirectarea este o alternativă; consultați Extinderea parametrilor de shell ).

  2. Când valoarea variabilei tmp1 este atribuită ref:

     ref=$tmp1  

    este declarată implicit o variabilă suplimentară, al cărei nume este valoarea ref. Valoarea tmp1 este, de asemenea, indirectă atribuită variabilei declarate implicit prin intermediul acestei atribuiri explicite către ref .

În contextul întrebarea dvs. legată , apelând read_and_verify as

 read_and_verify domain "Prompt text here..."  

va declara variabila domain și atribuiți-i valoarea tmp1 (adică intrarea utilizatorului). Este conceput exact pentru a reutiliza codul care interacționează cu utilizatorul și pentru a utiliza o variabilă denumiref pentru a declara domain și alte câteva variabile.

Pentru a arunca o privire mai atentă asupra părții implicite putem reproduce procesul pas cu pas:

 ## Assign a value to the first positional argument $ set -- "domain" ## Declare the same "tmp1" variable as in your code $ tmp1="value for domain" ## Declare a "ref" variable with the nameref attribute set and ## assign the value "domain" to it $ declare -n ref="$1" ## Note that there is no "domain" variable yet $ declare -p domain bash: declare: domain: not found ## Assign a value to "ref" and, indirectly, to the "domain" variable ## that is implicitly declared $ ref=$tmp1 ## Verify that a variable named "domain" now exists, and that ## its value is that of "tmp1" $ declare -p domain declare -- domain="value for domain" ## Verify that "ref" is actually a reference to "domain" $ domain="new value" $ echo "$domain" new value $ declare -p ref declare -n ref="domain" $ echo "$ref" new value  

1 Referință: CHANGES , secțiunea ” 3. Funcții noi în Bash „, punct ” w „.
Acest lucru poate fi relevant: de exemplu, CentOS Linux 7.6 (în prezent ultima versiune) este livrat cu Bash 4.2 .

2 Ca de obicei cu shell builtins, o explicație exhaustivă și concisă este evazivă, deoarece efectuează diverse acțiuni, posibil eterogene. Mă voi concentra pe declararea, atribuirea și setarea numai a atributelor și voi lua în considerare listarea, extinderea și eliminarea atributelor în afara sferei acestui răspuns.

3 Acest comportament al declare -p a fost introdus în Bash 4.4. Referință: fișier CHANGES , secțiunea ” 3. Funcții noi în Bash „, punctul ” f „.
Ca G-Man subliniat în comentarii, în Bash 4.3 declare name; declare -p name produce o eroare. Dar puteți totuși verifica dacă name există cu declare -p | grep "declare -- name".

4 FullBashGuide, Parametri pe mywiki.wooledge.org

Comentarii

  • (1) Nu pot reproduce rezultatele afișate în primul bloc de cod: declare name urmat de produce „bash: declare: name: not found”. (Deși declare -p | grep na produce declare -- name.) (2) Cred că este puțin înșelător să prezinți echo "${name-isunset}" în contextul declare name, în măsura în care tratează o variabilă nedeclarată (adică nedefinită) la fel ca o declarată dar variabilă unset . (3) S-ar putea să doriți să menționați că numele de referință sunt disponibile numai în versiunea bash 4.3 și mai mare.
  • @ G-Man Vă mulțumim pentru remarcile dvs.! ‘ le voi adresa imediat ce pot și ‘ îmi voi actualiza răspunsul acolo unde este cazul. În ceea ce privește (1), GNU bash, version 5.0.7(1)-release (x86_64-pc-linux-gnu) de pe Arch Linux dă în continuare rezultatele pe care le-am arătat. Poate că acel comportament a fost introdus abia recent, ‘ îl voi investiga.
  • Da; ‘ folosesc doar versiunea 4.3.
  • @ G-Man Answer actualizat cu note despre (1) și (3). Despre (2): am urmărit să ilustrez că declare x nu ‘ setează x, în timp ce declare x= o face. Nu am putut ‘ să găsesc nicio referință care să susțină afirmația că declare -- x (ca ieșire din declare -p x) înseamnă ” nu este setat „, în timp ce declare -- x="" înseamnă ” set ” astfel am adus extinderea ${parameter-word}, chiar dacă nu poate discrimina între ” unset ” și ” nu există ‘ nu există „, după cum subliniați. ‘ Nu știu cum pot clarifica acest lucru în răspunsul meu (fără a distrage atenția cititorului de la punctul respectiv).

Răspunde

Voi încerca să explic asta, dar iartă-mă dacă nu voi urma exemplul pe care l-ai furnizat. Mai degrabă voi încerca să vă ghidez de-a lungul propriei mele abordări diferite.

Spuneți că înțelegeți deja concepte precum „variabile” și „extinderea acestora” etc. cunoștințe de fond care altfel ar necesita o concentrare mai profundă.

Deci, voi începe prin a spune că, cel mult de bază nivel, comanda declare este doar o modalitate prin care puteți spune lui Bash că aveți nevoie de o valoare variabilă (adică o valoare pe care s-ar putea schimba în timpul executării scriptului) și că consultați acea valoare folosind un nume specific, exact numele pe care îl indicați lângă comanda declare.

Adică:

 declare foo="bar"  

îi spune lui Bash că dorim ca variabila numită foo să aibă valoarea bar.

Dar .. țineți un minut .. putem face asta fără să folosești deloc declare, nu putem? Ca și în:

 foo="bar"  

Foarte adevărat.

Ei bine , se întâmplă ca atribuirea simplă de mai sus să fie de fapt un mod implicit pentru .. de fapt .. declararea unei variabile.

( De asemenea, se întâmplă ca cele de mai sus să fie una din câteva moduri de a modificați valoarea variabilei numite foo; într-adevăr, este exact cea mai directă, mod concis, evident, direct .. dar nu este singurul .. .. Voi reveni la asta mai târziu .. ).

Dar atunci, dacă este așa este posibil să declarați un „nume care va eticheta valorile variabilei” (doar „variabilă” de acum înainte, din motive de scurtă durată) fără a utiliza deloc declare, de ce ați dori vreodată să folosești această pomposă comandă „declara”?

Răspunsul constă în faptul că implicațiile de mai sus Modul de a declara o variabilă (foo="bar"), implicit .. îl face pe Bash să considere acea variabilă a fi de tipul care este cel mai frecvent utilizat în scenariul de utilizare tipic pentru un shell .

Un astfel de tip este tipul șirului, adică o secvență de caractere fără niciun sens special. Prin urmare, un șir este ceea ce primești atunci când folosești declarația implicită.

Dar tu, ca programator, uneori trebuie să consideri mai degrabă o variabilă ca, de exemplu, un număr .. pe care trebuie să faci aritmetică operațiuni .. și folosind o declarație implicită ca foo=5+6 nu face ca Bash să atribuie valoarea 11 la foo ca te-ai putea aștepta. Mai degrabă îi va atribui foo secvența celor trei caractere 5 + 6.

Deci .. aveți nevoie de o modalitate de a spune lui Bash că doriți ca foo să fie considerat un număr, nu un șir .. și pentru asta este util un declare util.

Spuneți doar:

 declare -i foo=5+6 # <<- note the "-i" option: it means "integer"  

și Bash va face cu bucurie calculele pentru dvs. și va atribui valoarea numerică 11 variabilei foo.

Adică: spunând declare -i foo dați variabilei foo atribut de a fi un număr întreg.

Declararea numerelor (exact numere întregi, deoarece Bash încă nu înțelege zecimale, virgule mobile și toate acestea) poate fi primul motiv pentru utilizarea declare, dar nu este singurul motiv. După cum ați înțeles deja, există câteva alte atribute pe care le puteți da variabilelor. De exemplu, puteți avea Bash pentru a face întotdeauna valoarea unei variabile majuscule indiferent de ce: dacă spuneți declare -u foo, atunci de atunci înainte când spuneți foo=bar Bash atribuie de fapt șirul BAR variabilei foo.

Pentru a da oricare dintre aceste atribute la o variabilă, trebuie să utilizați comanda declare, nu există altă opțiune.


Acum, una dintre atributele pe care le puteți da prin declare este cel faimos „nume-ref”, atributul -n. ( Și acum voi relua conceptul pe care l-am pus mai devreme ).

Atributul name-ref, practic, permite programatorilor Bash un alt mod de a schimba valoarea a unei variabile. Mai exact oferă o modalitate indirectă de a face acest lucru.

Iată cum funcționează:

Tu declare o variabilă având atributul -n și este foarte recomandat (deși nu este strict necesar, dar simplifică lucrurile) să acordați și o valoare acestei foarte variabile pe același declare command. Astfel:

 declare -n baz="foo"  

Acest lucru îi spune lui Bash că, de atunci pe, de fiecare dată când veți utiliza sau veți modifica valoarea variabilei numite baz, aceasta va utiliza de fapt sau va modifica valoarea variabilei numită foo.

Ceea ce înseamnă că, de atunci, voi poți spune ceva de genul baz=10+3 pentru ca foo să obțină valoarea 13.Presupunând, desigur, că foo a fost declarat anterior ca întreg (declare -i) așa cum am făcut acum doar un minut, altfel va primi secvența din cele patru caractere 1 0 + 3.

De asemenea: dacă modificați direct valoarea foo, ca în foo=15, veți vedea 15, de asemenea, spunând echo “${baz}”. Acest lucru se datorează faptului că variabila baz declarată ca nume-ref a foo reflectă întotdeauna foo valoare.

Comanda declare -n de mai sus se spune „nume-referință” deoarece face variabilă baz consultați numele unei alte variabile. De fapt, am declarat că baz are valoarea „foo” care, datorită opțiunii -n, este tratată de Bash ca nume pentru o altă variabilă.

Acum, de ce pe Pământ ai vrea vreodată să faci asta?

Ei bine .. merită să spunem că aceasta este o caracteristică pentru nevoi destul de avansate.

De fapt, atât de avansată încât atunci când un programator se confruntă cu o problemă care ar necesita într-adevăr un nume de referință, este probabil că o astfel de problemă ar trebui abordată mai degrabă utilizând un limbaj de programare adecvat în loc de Bash.

Una dintre acele nevoi avansate este, de exemplu, atunci când tu, ca programator, nu poți ști în timpul dezvoltării care variabilă va trebui să o utilizați într-un anumit punct al unui script, dar va să fie pe deplin cunoscut dinamic în timpul rulării. Și având în vedere că niciun programator nu poate interveni în timpul rulării, singura opțiune este de a prevedea în prealabil o astfel de situație în script și un „nume-ref” poate fi singurul viabil cale. Ca un caz de utilizare cunoscut pe scară largă al acestei nevoi avansate, gândiți-vă la plugin-uri, de exemplu. Programatorul unui program „plug-capable” trebuie să furnizeze în prealabil generic pentru pluginuri viitoare (și, eventual, terțe părți). Prin urmare, programatorul va trebui să utilizeze facilități precum un nume de referință în Bash.

O altă necesitate avansată este atunci când trebuie să vă ocupați de o cantitate mare de date în RAM și trebuie să transmiteți aceste date în jurul funcțiilor scriptului dvs., care de asemenea trebuie să le modifice pe parcurs. În acest caz, puteți cu siguranță copia acele date dintr-o funcție în alta (așa cum face Bash când faceți dest_var="${src_var}" sau când invocați funcții ca în myfunc "${src_var}"), dar fiind aceste date o cantitate uriașă ar face o risipă uriașă de RAM și pentru o operațiune foarte ineficientă. Deci, soluția dacă apar astfel de situații este să nu folosiți o copie a datelor, ci o referință la aceste date. În Bash, un nume de referință. Acest caz de utilizare este într-adevăr norma în orice limbaj de programare modern, dar este destul de excepțional când vine vorba de Bash, deoarece Bash este conceput în principal pentru scripturi simple scurte care se ocupă în mare parte de fișiere și comenzi externe și astfel scripturile Bash rareori trebuie să treacă cantitatea de date între funcții. Și atunci când funcțiile unui script trebuie să împărtășească unele date (accesați-le și modificați-le), acest lucru se realizează de obicei doar folosind o variabilă globală, ceea ce este destul de normal în scripturile Bash, atât cât este foarte depreciat în limbaje de programare adecvate.

Apoi, poate exista un caz de utilizare notabil pentru referințele de nume în Bash și (poate în mod ironic) este asociat când utilizați încă alte tipuri de variabile:

  1. variabile care sunt declarate ca „matrici indexate” (declare -a)
  2. variabile care sunt declarate ca „matrici asociative” (declare -A).

Acestea sunt un tip de variabile care pot fi mai ușor (precum și mai eficiente) transmise de-a lungul funcțiilor folosind nume-ref-uri în loc de copiere normală, chiar și atunci când nu conțin cantități uriașe de date.

Dacă toate aceste exemple sună ciudat și totuși de neînțeles, este doar pentru că numele-ref-uri sunt într-adevăr un subiect avansat și o necesitate rară pentru scenariul de utilizare tipic al lui B. cenușă.

Aș putea să vă povestesc despre ocazii în care eu am găsit pentru referințe de nume în Bash, dar până acum au fost în mare parte pentru nevoi destul de „ezoterice” și complicate, iar eu sunt temându-mă că, dacă le-aș descrie, îți voi complica lucrurile doar în acest moment al învățării tale. Doar pentru a menționa cel mai puțin complex (și, eventual, nu esoteric): returnarea valorilor din funcții. Bash nu acceptă cu adevărat această funcționalitate, așa că am obținut același lucru folosind nume-ref. De altfel, acesta este exact ceea ce face codul dvs. de exemplu.


Pe lângă acesta, un mic sfat personal, care ar fi de fapt mai potrivit pentru un comentariu, dar nu am reușit să-l condensez suficient pentru a se încadra în limitele „comentariului” StackExchange.

Cred că cel mai mult pe care ar trebui să-l faceți în acest moment este să experimentați doar cu referințele de nume folosind exemplele simple pe care le-am arătat și poate cu codul de exemplu pe care l-ați furnizat, fără a lua în considerare pentru moment partea „de ce pe pământ” și concentrându-se doar pe partea „cum funcționează”. Experimentând puțin, partea „cum” se poate scufunda mai bine în mintea ta, astfel încât partea „de ce” îți va fi clară în timp util când (sau dacă) vei avea o problemă practică reală pentru care un nume- ref ar veni cu adevărat la îndemână.

Comentarii

  • LL3 Îmi place foarte mult răspunsul tău și am aruncat cu degetul în sus: în sfârșit înțeleg ce face declarația – – nu declararea variabilelor ci declararea atributelor acestora; totuși, din păcate, mi-am pierdut urmele când ați început să explicați ce este un nume-ref. Nu am idee ce face și de ce să-l folosesc.
  • Asta este – de ce s-ar da acest atribut
  • @JohnDoea văd. Poate că ați putea lăsa acest subiect pentru moment. Probabil că este prea devreme pentru a înțelege acest concept în momentul actual al învățării. Oricum, mi-am extins răspunsul cu mai multe exemple și, de asemenea, o mică addendum personal cu privire la modul în care cred că ar trebui să procedați. De asemenea, am pus linii orizontale pentru a delimita explicația generală a declare din explicația specifică a -n din addendumul personal. De asemenea, am făcut o reformulare aici și colo, dar nimic substanțial, așa că cred că este posibil să recitiți partea -n plus micul addendum.
  • Mulțumesc, cred că este ‘ în regulă să aflu acest lucru chiar acum, am nevoie doar de o explicație pe care o pot înțelege și ar trebui să recitesc astăzi întregul răspuns, ‘ m aici.
  • Menționați foo="bar" și declare foo="bar" . Poate doriți să menționați (dacă este doar într-o notă de subsol) că, într-o funcție shell, declare foo="bar" creează o variabilă locală și foo="bar" creează o variabilă globală.

Răspuns

În general, declare în bash shell setează (sau elimină sau afișează) atribute pe variabile. Un atribut este un fel de adnotare care spune „aceasta este o referință de nume”, sau „aceasta este o matrice asociativă”, sau „această variabilă trebuie întotdeauna evaluată ca un întreg”, sau „această variabilă este numai în citire și nu poate fi setat din nou „, sau” această variabilă este exportată (o variabilă de mediu) „etc.

typeset încorporat este un sinonim pentru declare în bash, deoarece typeset este utilizat în alte cochilii (ksh, de unde a provenit, și zsh, de exemplu) pentru setarea atributelor variabilei.


Privind mai atent exemplul de referință al numelui din întrebarea:

Funcția shell pe care o afișați, cu un bit adăugat de cod care îl folosește:

#!/bin/bash function read_and_verify { read -p "Please enter value for "$1": " tmp1 read -p "Please repeat the value to verify: " tmp2 if [ "$tmp1" != "$tmp2" ]; then echo "Values unmatched. Please try again."; return 2 else declare -n ref="$1" ref=$tmp1 fi } read_and_verify foo printf "The variable "foo" has the value "%s"\n" "$foo" 

Rularea acestui lucru:

 $ bash script.sh Please enter value for "foo": hello Please repeat the value to verify: hello? Values unmatched. Please try again. The variable "foo" has the value "" 

Aceasta arată că variabila foo nu este setată la nimic atunci când utilizatorul introduce două diferite șiruri.

Aceasta arată că variabila foo este setată la șirul pe care utilizatorul l-a introdus atunci când a intrat în șirul același de două ori .

Modul în care $foo obține valoarea hello din partea principală a scriptului este următorul rând în funcția shell:

declare -n ref="$1" ref=$tmp1 

unde $tmp1 este șirul hello introdus de utilizator și $1 este șirul foo transmis pe linia de comandă a funcției din partea principală a script.

Observați că variabila ref este declarată cu declare -n ca variabilă de referință a numelui și că valoarea foo este dat ca valoare în declarația respectivă. Aceasta înseamnă că, din acel moment, până când variabila trece din sfera de aplicare, orice utilizare a variabilei ref va fi aceeași cu utilizarea foo. Variabila ref este o variabilă de referință a numelui care face referire la foo în acest moment.

Aceasta are consecința că atribuirea unei valori ref, așa cum se face pe linia care urmează declarației, va atribui valoarea foo.

Valoarea hello este apoi disponibilă în $foo în partea principală a scriptului.

Lasă un răspuns

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