|
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 |