Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Witam!
Pisze sobie kilka skryptów w bashu odnośnie zasilania (na razie dla siebie, ale planuje wrzucić na DUGa i do AUR). Mam takie polecenie:
who | grep "(:.*)" | awk '{ print $5 " " $1 }'
jak wrzucić każdą linijkę która wyskoczy do kolejnego elementu? bo na przykład coś takiego;
zalogowani=$(who | grep "(:.*)" | awk '{ print $5 " " $1 }')
wrzuca wszystko do zalogowani[0] ;// . Domyślam się, że trzeba użyć pętli for - jeżeli tak proszę chociaż o jakiegoś linka /przykład jak to się robi.
Pozdrawiam
Offline
Do hashy (tablic asocjacyjnych) lepiej bierz od razu perla.
Działa szybciej od basha (obsługa tablicy) i w przeciwieńswie do basha, w perlu to chleb powszedni, podczas, gdy skryptów basha używajacych tablic ze świeczką można szukać.
Sznurek:
http://pl.wikibooks.org/wiki/Perl/Zmienne#Tablice_asocjacyjne
Dodatkowo, w razie, gdyby ten skrypt urósł do niepokojących rozmiarów - ~>1000 linii, też łatwiej ogarniesz perla niż basha, zwłaszcza, jak przyda się baza SQL, albo plik XML, czy choćby referencje, lub któryś z XXXX gotowych modułów.
Pozdrawiam
;-)
Ostatnio edytowany przez Jacekalex (2013-04-20 13:07:29)
Offline
No ciekawy ten perl, ale to w sumie mały prosty skrypt a obecnie mało czasu na poznawanie czegoś nowego. Póki co skleciłem i u mnie (Arch Linux) działa bez zarzutów;
http://pastebin.com/raw.php?i=2iTYbTqz
przydatne jeżeli mamy jakieś skrypty w tle na roocie czy np. z crona w bashu - można łatwo o czymś powiadomić zalogowanych użytkowników w Xach za pomocą libnotify. Sprawdzałem na Wheezy (na maszynie wirtualnej) i też działa tylko tam polecenie who pokazuje duplikaty (np. kilka razy ten sam użytkownik i ten sam $DISPLAY) - czego Arch nie robi, więc trzeba byłoby dodać jakieś uniq/sort -u -k1,1 itd.. żeby nie wyskakiwało notify np. po dwa razy.
Ostatnio edytowany przez dominbik (2013-04-20 16:07:05)
Offline
Tak, musisz użyć pętli. Najlepiej do tego nadaje się while w potoku, ale musisz wziąć pod uwagę, że wtedy kod wewnątrz pętli jest wykonywany w podpowłoce (więc tablica nie będzie powiększana o kolejne elementy). Istnieje kilka obejść.
Poza tym zamiast wywoływać grepa, możesz sprawdzać występowanie w awk-u.
Gotowy kod:
ARRAY=() while read line; do ARRAY+=("$line") done < <(who | awk '/\(.*\)/ {print $5 " " $1 }')
Przekierowanie wyjścia polecenia jest bashyzmem (zresztą dość nieczytelnym), ale są nim też tablice, więc nie musisz się tym specjalnie przejmować.
Nawiasem mówiąc, tablice w bashu są tak cholernie wolne, że przy większej liczbie elementów już lepiej użyć plików tymczasowych. Albo, jak radzi Jacekalex, normalnego języka programowania (perl lub python).
Offline
Minio dzięki, chociaż mam wrażenie, że mojego postu nie widziałeś ;) na szczęście udało mi się jakoś bez tych tablic - w sumie nie wiem po co je chciałem (nie znam dobrze basha). w przyszłości spróbuję się nauczyć tego perla, ale to w przyszłości. do pythona mam uraz a bash no tak jak mówicie - nie jest to stricte język programowania.
Ostatnio edytowany przez dominbik (2013-04-20 16:22:58)
Offline
Swój opublikowałem dwie minuty po tym, jak pojawił się Twój, więc nie — nie widziałem. Akurat ten silnik forum nie informuje, że w momencie komponowania wiadomości pojawił się nowy post w wątku.
Offline