From: Hoppke Newsgroups: pl.comp.os.linux Subject: Re: sed i namolny shell (interpretuje nie to co trzeba) Message has been fingerprinted by Ober0n: > Ta. Tylko że ja nawet nie wiem jak to działa (a to już wyklucza jego > użycie :-) ). Mógłbyś wyjaśnić skąd ten potworek, albo gdzie znajdę > informacje o konstrukcji takich wynalazków? Przyda się, jeżeli > to takie szybkie... ${VAR%PATTERN} lub ${VAR#PATTERN} Za "VAR" podstawiasz nazwę zmiennej, ale już bez "$". A za PATTERN podstawiasz wzorzec który chcesz odciąć. Możesz używać we wzorcach symbolu '*'. Jak widzisz, są to dwie konstrukcje, jedna używa "%", druga używa "#". Od tego zależy, czy wzorzec będzie odcinany od początku czy od końca zmiennej. Przykłady: # tekst="ala ma kota" # echo ${tekst% kota} ala ma # echo ${tekst%ma*} ala Jak widać, "%" powoduje odcinanie od końca zmiennej. To pozwala np. łatwo obcinać rozszerzenia - ${plik%.jpg} "#" z kolei odcina dany wzorzec od początku zmiennej. # echo ${tekst#ala } ma kota # echo ${tekst#ala ma ko} ta Więc zakładając, że masz np. taką zmienną: plik=/usr/share/gfx/plik.png i chcesz wyciągnąć samą nazwę pliku, to musisz odciąć katalogi i rozszerzenie. Katalogi możesz odciąć tak: ${plik#*/} co usunie wszystko aż do ukośnika (i łącznie z ukośnikiem). Ale jeśli to sprawdzisz, to okaże się, że odcięło tylko pierwszy ukośnik. Jeśli zamienisz to na ${plik#*/*/}, to odetniesz już człon '/usr/'. Ale nie tędy droga. Można przestawić dopasowywanie wzorców w tryb "zachłanny", tzn. gwiazdka będzie wtedy symbolizować nie "jak najmniej", ale "jak najwięcej" znaków. Wtedy wzorzec '*/' zatrzyma się dopiero na ostatnim ukośniku. A robi się to po prostu przez zdublowanie znaku '%' lub '#'. Czyli robisz plik=${plik##*/} i dostajesz w zmiennej $plik ciąg "plik.png". Teraz wystarczy odciąć rozszerzenie: # echo ${plik%.png} plik No. A na koniec można wykorzystać fakt, że konstrukcje ${} można w sobie zagnieżdżać, więc można całą operację wykonać tak: ${${plik##*/}%.png} Najpierw te wewnętrzne nawiasy odcinają katalogi, a potem nawiasy zewnętrzne amputują rozszerzenie. Banalne w użyciu, wystarczy sobie tylko trochę potrenować z "echo" i jakimś stringiem żeby załapać jak to działa. -- ? Chcesz wiedzieć co Hoppke jadł na śniadanie? Nie? ? A może interesuje Cię co porabia jego urojona wiewiórka? Też nie? Mimo wszystko obejrzyj ten jedyny w swoim rodzaju ChangeBlog: .°.°.°.°.°.°.: http://dobremiasto.net/~hoppke/ :.°.°.°.°.°.°.