Pobierz Firefoksa teraz i podpal sieć!

    
Polecenie eval


Z własnego doświadczenia wiem, że działanie eval nie jest takie oczywiste w związku z tym spróbuję je w miarę szczegółowo omówić.


Naturalnym jest, że oczekuje się przypisywania wartości do zmiennej "w kierunku lewej strony", np. a=`echo foo` - polecenia zwracają swoje wyjście, które może być przypisane do zmiennej, w tym przypadku a=foo. W przypadku eval nie należy zajmować się tym co eval zwraca - tutaj wszystko odbywa się "po prawej stronie".

eval "polecenia shella"


Wpisanie w shellu samego `a' zróci błąd "command not found". Jednak `a=1' jest już poprawnym poleceniem shella (przypisaniem wartości do zmiennej). W związku z tym można spróbować:

eval "a=1"

echo $a


eval wykonało polecenie, które przypisało wartość 1 do zmiennej a. Teraz problem, z którym zetknęła się pewnie część programistów:

x=zmienna

y=1

zmienna1=BRAwo


W jaki sposób używając tylko zmiennych x, y wyświetlić tekst "BRAwo"?

Naturalne wydaje się:

echo $x$y


jednak takie polecenie zwraca "zmienna1". Z pomocą przychodzi eval:

eval "echo \$$x$y"


Takie polecenie działa w następujący sposób: argumenty dla eval zostają obliczone i podstawione jako komenda do wykonania, czyli:

echo -> echo

\$ -> $

$x -> zmienna

$y -> 1


W efekcie powoduje to wykonanie przez eval polecenia:

echo $zmienna1


Zauważ, że samo (bez eval) polecenie "echo \$$x$y" nie zadziała.


No dobrze, kolejny problem: jak wykorzystując zmienne x, y przypisać "BRAwo" do zmiennej z? Wiadomo już jak wyświetlić tekst "BRAwo", ale jak przypisać go do zmiennej?. Naturalne może się wydawać:

z=`eval "echo \$$x$y"`


które niestety nie zadziała. Jeżeli znasz odpowiedź, to gratuluję. Jeżeli nie, to nie martw się czytelniku - mi też nie działało. Próbowałem wielu (wymyślnych ;) ) metod i zadziałała dopiero ostatnia z nich - email do malekitha (dzięki malekith). Mam nadzieję, że teraz stwierdzenie "po prawej stronie" stanie się jeszcze bardziej zrozumiałe - wartość zmiennej należy przypisać po prawej stronie eval:

eval "echo z=\$$x$y"


Poniższe zadanie przesądzi ostatecznie czy zrozumiałeś eval:

Korzystając z programu

a1=B; a2=R; a3=A; a4=W; a5=O

for ((i=0; $i<=5; i++)); do

???

done


skopiuj wartości z a1..a5 do kolejnych wartości b1..b5, tak aby uzyskać:

b1=B; b2=R; b3=A; b4=W; b5=0


dokumentacja

man sh / man bash


Karol Kreński, mimooh at inf sgsp edu pl