morg Napisano Maj 21, 2009 Zgłoszenie Share Napisano Maj 21, 2009 Witam! Mam kilka katalogów w których przewija mi się jakiś stały człon. Dla tych katalogów chcę zrobić jakąś akcję która nie będzie wykonywana w przypadku gdy skrypt będzie pracował w katalogu który nie zawiera w nazwie stałego członu. Wydzielam nazwę ostatniego członu z $PWD: katalog=`pwd | awk 'BEGIN { FS="/"} {print $NF}' ` i dalej chciałbym to zrobić poprzez funkcję case. Ale tutaj juz kończy się moja wiedza. Dla przykladu: Stałym członem bedzie "kat" i "zas". - katalog1 - katalog2 - zasob3 - zasob4 W jaki sposób wydzielić działanie programu dla katalogu 1 i 2 ale zablokować dla zasobu 3 i 4 ? Bo kat* nie jest rozpoznawane. Uruchom() { case ${katalog} in "kat*") polecenie="$wywolaj_exe1" ;; "zas*") polecenie="$wywolaj_exe2" ;; *) polecenie="" ;; esac $polecenie } Z góry dziękuję za pomoc. M. Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
jjj Napisano Maj 21, 2009 Zgłoszenie Share Napisano Maj 21, 2009 Bo kat* nie jest rozpoznawane. Bo * jest rozwijane przez shella w liście parametrów, a nie przez skrypt przy porównywaniu łańcuchów w case. Użyj wyrażeń regularnych: albo sed-em, albo w bashu za pomcoą konstrukcji if [[ "$zmienna" =~ "wyrażenie" ]]; then np. -- ostrzegam, przykład jest głupi wzorzec="^dane.*" if [[ "$katalog" =~ "wzorzec" ]]; then tar -cf $katalog.tar $katalog fi Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
morg Napisano Maj 21, 2009 Autor Zgłoszenie Share Napisano Maj 21, 2009 Zapomniałem dodać ze to ma też działac na starym AIX'ie na którym nie ma " =~ " . Rzuce jeszcze okiem na to: wzorzec="^dane.*" if [[ "$katalog" =~ "wzorzec" ]]; then tar -cf $katalog.tar $katalog fi Przyklad nie jest glupi. On daje rozwiązanie. Dzieki m. EDIT: Co może rozwinąć listę parametrów, oprócz implementacji kodu źródłowego basha do skryptu? EDIT2: Masz na myśli jakąś składnie sed'a, która wskaże katalog roboczy w którym znajduje się zdefiniowany ciąg? Mógłbyś podać przykład? Przewertowałem nieco sieć i z sensowniejszych rzeczy znalazłem: http://pl.wikipedia.org/wiki/Sed_(program) http://www.digipedia.pl/man/sed.1.html http://sed.sourceforge.net/ http://sed.sourceforge.net/sed1line.txt http://www.debian.org/doc/manuals/reference/ch-tips.pl.html EDIT3: Np coś takiego: sed -n '/regexp/p' # method 1 sed '/regexp/!d' # method 2 Tylko nie bardzo wiem jak to zaimplementować w kod by stworzyć spójną i działającą całość. Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
morg Napisano Maj 22, 2009 Autor Zgłoszenie Share Napisano Maj 22, 2009 Rozwiązanie: aix:/wdr/bazy/gb$ ls nazwa_katalogu_bez_wzorca nazwa_katalogu_z_wzorzec aix:/wdr/bazy/gb$ a=`ls |grep -e wzorzec` aix:/wdr/bazy/gb$ cd $a aix:/wdr/bazy/gb/nazwa_katalogu_z_wzorzec$ Dzieki za pomoc. M. Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
jjj Napisano Maj 22, 2009 Zgłoszenie Share Napisano Maj 22, 2009 Co może rozwinąć listę parametrów, oprócz implementacji kodu źródłowego basha do skryptu? Np. pętle for i while działające na listach, jak for plik in *; do echo $plik; done Masz na myśli jakąś składnie sed'a, która wskaże katalog roboczy w którym znajduje się zdefiniowany ciąg? Nie. Chodziło mi o doraźne przepuszczenie ścieżki przez sed-a, żeby dowiedzieć się, czy jest zgodna z wzorcem. Zamiast =~ z wzorcem regularnym, zmuszamy sed-a do przekształcenia łańcucha na okoliczność dopasowania, a wynik przyrównujemy do stałego wzorca: plik=$1 wzorzec='a' if [[ `echo $plik | sed -e "s/^$wzorzec.*/$wzorzec/"` == $wzorzec ]]; then echo $plik dopasowany do $wzorzec else echo niedopasowany fi Przy czym na pewno da się zrobić to zgrabniej. // edit Dla listy trzeba by wyciąć wiersze niedopasowane do wzorca. W sed-zie coś w rodzaju `ls | sed -e "/^$wzorzec/! d"` Ale jasne, w opisanym przez ciebie przypadku grep wystarczy. Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
morg Napisano Maj 22, 2009 Autor Zgłoszenie Share Napisano Maj 22, 2009 Moje rozwiązanie nie do końca mi pasuje bo muszę się przygotować na kilka katalogów z takim samym wzorcem, a w Twoim @jjj nie wiem co wstawić w zmienną $plik. Jeśli nie wstawię to $plik ma pustą wartość i wynik polecenia zawsze jest na "else". Z sed'em jeszcze takie eksperymenty przychodzą mi do głowy: aix:/wdr/bazy/22101/gb$ ls AAA c nazwa_katalogu_bez_wzorca a d nazwa_katalogu_z_wzorzec b e aix:/wdr/bazy/22101/gb$ wzorzec=A aix:/wdr/bazy/22101/gb$ ls | sed -n "/$wzorzec/p" AAA aix:/wdr/bazy/22101/gb$ wzorzec=wzorzec aix:/wdr/bazy/22101/gb$ ls | sed -n "/$wzorzec/p" nazwa_katalogu_z_wzorzec aix:/wdr/bazy/22101/gb$ wzorzec=nazwa aix:/wdr/bazy/22101/gb$ ls | sed -n "/$wzorzec/p" nazwa_katalogu_bez_wzorca nazwa_katalogu_z_wzorzec aix:/wdr/bazy/22101/gb$ Popatrzę na to na weekendzie, bo mi właśnie komputer wrócił z naprawy, i może coś czasu wygospodaruje. M. Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
jjj Napisano Maj 22, 2009 Zgłoszenie Share Napisano Maj 22, 2009 a w Twoim @jjj nie wiem co wstawić w zmienną $plik Np. niech to będzie zmienna kontrolna w pętli for. sed czy grep, w każdym razie regexy są kluczowe. Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
morg Napisano Maj 25, 2009 Autor Zgłoszenie Share Napisano Maj 25, 2009 Rozwiązałem to poprzez pętle for, Dziękuję za pomoc. m. Edit1. Nie do końca rozwiązałem: wersja 1 rozdzielpliki() { wzorzec= katalog1 katalog2 katalog3 katalog4 case $wzorzec in "katalog1") echo katalog1 ;; "katalog2") echo katalog2 ;; "katalog3") echo katalog3 ;; "katalog4") echo katalog4 ;; *) echo pusto ;; esac } wersja 2 rozdzielpliki() { case $wzorzec in "` ls ../ | sed -n "/$katalog1/p"` ") echo katalog1 ;; " `ls ../ | sed -n "/$katalog2/p"` ") echo katalog2 ;; " `ls ../ | sed -n "/$katalog3/p"`") echo katalog3 ;; " `ls ../ | sed -n "/$katalog4/p"`") echo katalog4 ;; *) echo pusto ;; esac } Wersja 1 ladniejsza i czytelniejsza ale brakuje mi wiedzy w jaki sposób dodać do zmiennej $wzorzec kilkanaście różnych (stałych) nazw . m. Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
morg Napisano Maj 26, 2009 Autor Zgłoszenie Share Napisano Maj 26, 2009 W nowym poście coby nie zaśmiecać: tablica[1]=`pwd | awk 'BEGIN { FS="/"} {print $NF}' | sed -n "/alog1/p"` tablica[2]=`pwd | awk 'BEGIN { FS="/"} {print $NF}' | sed -n "/alog2/p" ` tablica[3]=`pwd | awk 'BEGIN { FS="/"} {print $NF}' | sed -n "/alog3/p" ` tablica[4]=`pwd | awk 'BEGIN { FS="/"} {print $NF}' | sed -n "/alog4/p" ` case `echo ${tablica[@]}` in "katalog1") echo katalog1 ;; "katalog2") echo katalog2 ;; "katalog3") echo katalog3 ;; "katalog4") echo katalog4 ;; *) echo nie dziala ;; esac Przykład działa w strukturze katalogów zgodnych z pełnymi nazwami (katalog1, katalog2, ...). W jaki sposób odwrócić tak by wzorce były w funkcji case a ta dopasowywała by wzorce do $PWD w którym pracuje? m. Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
morg Napisano Maj 29, 2009 Autor Zgłoszenie Share Napisano Maj 29, 2009 Poniższy przykład działa dla każdego katalogu. W tym sensie, że: - dla katalogu który jest zdefiniowany w zmiennej tablicowej - dla katalogu dla którego nie ma zdefiniowanej zmiennej. f() { tablica[1]=`pwd | awk 'BEGIN { FS="/"} {print $NF}' | sed -n "/alog1/p"` tablica[2]=`pwd | awk 'BEGIN { FS="/"} {print $NF}' | sed -n "/alog2/p" ` tablica[3]=`pwd | awk 'BEGIN { FS="/"} {print $NF}' | sed -n "/alog3/p" ` tablica[4]=`pwd | awk 'BEGIN { FS="/"} {print $NF}' | sed -n "/alog4/p" ` if # [[ "`echo ${tablica[@]}`" = "" ]] # lub ładniejsze if [ -z `echo ${tablica[@]}` ] then printf "\n\n\n\n \t\t\t koniec pracy bo pusta tablica" else printf "\n\n\n\n \t\t\t dziala, bo tablica wypelniona " echo tablica to : `echo ${tablica[@]}` fi } Zasada działania jest prosta. W przypadku gdy funkcja napotka zdefiniowany ze wzorcem katalog wykona określony kod. W tym przypadku mało skomplikowany printf informujący o pwd zgodnym z jakąś tablicą. W innym przypadku też mało skomplikowany printf ze tablica jest pusta. m. edit: korekta warunku (if [ -z `echo ${tablica[@]}` ]) Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się