Revenind valori de la funcțiile de bash, grup linux exp
Revenind valori de la funcțiile Bash
Funcții Bash, spre deosebire de cele mai multe funcții în limbaje de programare nu oferă o oportunitate clară de a reveni rezultatul de execuție. Când Bash-funcția eșuează, acesta returnează o stare de finalizare: zero pentru finalizarea cu succes a nenulă - probleme de semnalizare. Pentru a reveni valori, puteți seta o variabilă globală a gardului în valorile ei, sau de a folosi substituirea sau trece o valoare unei variabile locale. Exemplele de mai jos arată modul de utilizare a acestor abordări.
Deși Bash returnează un cod de ieșire, care este de o importanță practică? ce să fac cu ea? Codul retur este conținută în variabila $. Dacă funcția pentru un motiv oarecare nu returnează un cod de ieșire, acest cod va fi codul de retur al ultimei instrucțiuni în funcție. Astfel, nevoia de trucuri.
Cel mai simplu mod - pentru a seta o variabilă la nivel mondial pentru a stoca rezultatul. Deoarece Bash toate variabilele globale în mod implicit, este simplu:
Funcția myfunc ()
myresult = „o anumită valoare“
>
myfunc
$ Myresult echo
Acest cod setează variabila globală în interiorul funcției rezultat myresult. Destul de simplu, dar după cum știm cu toții, setarea variabilelor globale în programe mari pot provoca trudnootlavlivaemyh bug-uri.
Cele mai bune practici, vom presupune utilizarea de variabile locale. Principala problemă care trebuie depășită este modul de a returna valoarea funcției procesului apelant. O modalitate - de a folosi schimbarea de comandă:
Funcția myfunc ()
myresult locală = „o anumită valoare“
echo "$ myresult"
>
rezultat = $ (myfunc) # sau rezultat = `myfunc`
$ Rezultat echo
Rezultatul va fi aici într-un curent de ieșire standard, și o oportunitate de a apuca de substituție. variabilă pot fi utilizate, dacă este necesar.
Un alt mod de a reveni valoare - trece într-un nume de variabilă funcție ca parametru de linie de comandă și rezultatul record unei funcții:
Funcția myfunc ()
__resultvar locală = $ de 1
myresult locală = „o anumită valoare“
EVAL $ __ resultvar = " '$ myresult'"
>
rezultatul myfunc
$ Rezultat echo
Din moment ce avem un nume variabile care stochează numele variabilei cu rezultatul, putem defini o variabilă de ieșire direct din linia de comandă. Este necesar să se utilizeze eval pentru a atribui o valoare.
Când vom păstra numele variabilei a trecut de la linia de comandă, ar trebui să fie sigur că acest nume nu va fi utilizat de procesul apelant (deci doar în cazul în care am folosi aici __resultvar, nu resultvar). Dacă acest lucru se întâmplă, variabila rezultat nu este setat. De exemplu, următoarea constructul nu va funcționa:
Funcția myfunc ()
rezultat locale = $ de 1
myresult locală = „o anumită valoare“
$ Rezultat EVAL = " '$ myresult'"
>
rezultatul myfunc
$ Rezultat echo
Motivul pentru care acest lucru nu funcționează, este în particularitățile declarația eval. Când eval efectuează a doua interpretare, și calculează rezultatul = „o valoare“, rezultă din acest moment - o variabilă locală și să nu depășească funcția.
Pentru o mai mare flexibilitate, puteți combina ambele metode, și transferul parametrului nume și de substituție:
Funcția myfunc ()
__resultvar locală = $ de 1
myresult locală = „o anumită valoare“
în cazul în care [[ "$ __ resultvar"]]; atunci
EVAL $ __ resultvar = " '$ myresult'"
altfel
echo "$ myresult"
Fi
>
rezultatul myfunc
$ Rezultat echo
result2 = $ (myfunc)
$ Result2 echo
Dacă numele nu este trecut la parametrul, valoarea returnată va fi emisă la stanartny concluzie.