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
- În legătură: unix.stackexchange.com/questions/522366/…
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=
saudeclare name=
; - declarat , set și cu o valoare non nul după
name=value
sau .
Mai general, declare [options] name=value
- 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 ; - atribuie valoarea
value
la aceasta; - 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ă:
-
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 ). -
Când valoarea variabilei
tmp1
este atribuităref
:ref=$tmp1
este declarată implicit o variabilă suplimentară, al cărei nume este valoarea
ref
. Valoareatmp1
este, de asemenea, indirectă atribuită variabilei declarate implicit prin intermediul acestei atribuiri explicite cătreref
.
Î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
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:
- variabile care sunt declarate ca „matrici indexate” (
declare -a
) - 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"
șideclare 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ă șifoo="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.
declare name
urmat de produce „bash: declare: name: not found”. (Deșideclare -p | grep na
producedeclare -- name
.) (2) Cred că este puțin înșelător să prezințiecho "${name-isunset}"
în contextuldeclare 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.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.declare x
nu ‘ seteazăx
, în timp cedeclare x=
o face. Nu am putut ‘ să găsesc nicio referință care să susțină afirmația cădeclare -- x
(ca ieșire dindeclare -p x
) înseamnă ” nu este setat „, în timp cedeclare -- 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).