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, potrzebuje skrypt ktory koloruje procentowe zużycie procesora, mam cos takiego:
cputot="1" if [[ $cputot < 30 ]]; then cputot=$"\e[0;32m$cputot" elif [[ $cputot < 60 && $cputot > 29 ]];then cputot=$"\e[0;33m$cputot" else [[ $cputot < 99 && $cputot > 59 ]] cputot=$"\e[0;31m$cputot" fi echo -e "$cputot\e[0;0m"
i tu się dzieją dziwne rzeczy, bo no jesli zużycie jest wieksze niz 10% pokazuje ok, ale np gdzy jest rowne 9 lub 7.7 zamiast na zielono pokazuje na czerwono. Powoli trace nerwy bo szukałem i próbowałem juz kilku rozwiązan i przy kazdym są jakieś błędy. Prosze kogos ogarnietego o poprawienie mnie lub odesłanie do informacji jak to zrobic
Pozdrawiam TaZz
Offline
Po pierwsze doczytaj sekcję CONDITIONAL EXPRESSIONS w man bash, bo używasz operatorów do porównywania stringów w celu porównania liczb.
Po drugie shelle są ułomne i nie potrafią operować na liczbach z ułamkami (oddzielanymi kropką lub przecinkiem)¹. Aby obejść ten problem, musisz zastosować np. bc, który pomnoży Ci liczby przez 10 albo 100 (nie wiem z dokładnością do którego miejsca po przecinku masz swój wynik). Później wynik ten trzeba jeszcze pozbawić miejsc po przecinku (chociaż to same zera, mój bc i tak je wyświetla; być może da się to zmienić, ale ja nie znam na tyle dobrze tego programu).
Alternatywnie możesz użyć awk-a, perl-a czy czegoś innego, co doskonale radzi sobie z porównywaniem liczb z ułamkami dziesiętnymi.
¹ — zdaje się że wyjątkami są ksh i zsh, ale nie sprawdzałem.
Offline
obcinaj tak aby zostalo tylko to co jest przed kropka czyli:
cputot=`echo $cputot | cut -f1 -d.`
Offline
Minio napisał(-a):
Po pierwsze doczytaj sekcję CONDITIONAL EXPRESSIONS w man bash, bo używasz operatorów do porównywania stringów w celu porównania liczb.
Po drugie shelle są ułomne i nie potrafią operować na liczbach z ułamkami (oddzielanymi kropką lub przecinkiem)¹. Aby obejść ten problem, musisz zastosować np. bc, który pomnoży Ci liczby przez 10 albo 100 (nie wiem z dokładnością do którego miejsca po przecinku masz swój wynik). Później wynik ten trzeba jeszcze pozbawić miejsc po przecinku (chociaż to same zera, mój bc i tak je wyświetla; być może da się to zmienić, ale ja nie znam na tyle dobrze tego programu).
Alternatywnie możesz użyć awk-a, perl-a czy czegoś innego, co doskonale radzi sobie z porównywaniem liczb z ułamkami dziesiętnymi.
¹ — zdaje się że wyjątkami są ksh i zsh, ale nie sprawdzałem.
Dzieki za podpowiedź, przydało sie ale chyba nie do koca wszystko sie zgadza bo jakos mi sie udało (nie sugeruj sie podpisem bercik'a ;p)
bercik napisał(-a):
cputot=`echo $cputot | cut -f1 -d.`
nie do konca mi to rozwiazanie pasuje wiec zrobilem
cputot=`echo 9.9 |tr . ,`
czyli zmiane . na , a przy wyniku ostatecznym odwrotnie
caly kod :
#!/bin/bash cputot=`echo 9.9 |tr . ,` if [[ $cputot -le 29 ]]; then cputot=$"\e[0;32m$cputot" elif [[ $cputot -le 59 ]];then cputot=$"\e[0;33m$cputot" elif [[ $cputot -le 99 ]];then cputot=$"\e[0;31m$cputot" else [[ $cputot -le 99 ]] cputot=$"\e[0;31;47m-!$cputot!-" fi echo -e $cputot"\e[0m"|tr , .
chyba działa ;x
Offline
No nie do końca — 89.9 wyświetla się na zielono zamiast na czerwono.
Zastosuj się do rady bercika i usuwaj część po przecinku. Myślę że to najlepsze rozwiązanie — Tobie i tak nie jest potrzebny pomiar z dokładnością do części dziesiątych (moja metoda by go uwzględniała, ale jednocześnie komplikowała całe zadanie).
Poza tym w ostatnim warunku chyba masz błąd, bo jest on dokładnie taki sam jak warunek przedostatni — a to oznacza że nie zostanie nigdy wykonany (a kiedy zostanie to dowiesz się, że wykrzykniki powinieneś zacytować).
Offline
Minio napisał(-a):
No nie do końca — 89.9 wyświetla się na zielono zamiast na czerwono.
Zastosuj się do rady bercika i usuwaj część po przecinku. Myślę że to najlepsze rozwiązanie — Tobie i tak nie jest potrzebny pomiar z dokładnością do części dziesiątych (moja metoda by go uwzględniała, ale jednocześnie komplikowała całe zadanie).
Poza tym w ostatnim warunku chyba masz błąd, bo jest on dokładnie taki sam jak warunek przedostatni — a to oznacza że nie zostanie nigdy wykonany (a kiedy zostanie to dowiesz się, że wykrzykniki powinieneś zacytować).
Fakt o dziwo niektóre liczby pokazuje dobrze inne źle. juz mniesza o to jak napisał bercik skasowałem kropki i cyfry za nią i teraz skrypt działa jak należy, ostatni warunek poprawilem bo byl wpisany na szybko. Dzieki za rady.
Offline
jezeli chesz po prostu w wyswietlaniu miec czesc ulamkowa to uzyj innej zmiennej do porownan (tej z usunietymi czesciami ulamkowymi) a innej (orginalnej) do wyswietlania
Ostatnio edytowany przez bercik (2010-01-07 22:48:54)
Offline
Wcale nie trzeba używać innej zmiennej.
if [ ${cputot%.*} -le 29 ]; then ...
Działa w dash-u więc wnioskuję że wszędzie indziej też (w bash-u na pewno, a tego używa TaZz).
Alternatywnie można
if [ $(echo $cputot |cut -f 1 -d .) -lt 29 ]; then ...
Offline
mozna i tak ... ale to bardziej ciezkie rozwiazanie w stosunku od osobnej zmiennej (bo operacja obcinania musi byc powielona iles tam razy) ...
Offline
Tak, chociaż myślę że w tym przypadku narzut na zasoby będzie niezauważalny.
Offline
skrypt to juz w sumie przeszłość, interesuje mnie tylko jak pobrac realne obciązenie procesora? to obecne jest na zasadzie ps --sort -pcpu i sumowanie kolumny % przy użyciu awk, jak probowalem dawac top -b to %cpu praktycznie sie nie zmienial jakies inne pomysły?
Offline