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!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2010-01-07 14:17:23

  TaZz - Użytkownik

TaZz
Użytkownik
Zarejestrowany: 2009-12-29

bash i liczby zmiennoprzecinkowe

witam, potrzebuje skrypt ktory koloruje procentowe zużycie procesora, mam cos takiego:

Kod:

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

 

#2  2010-01-07 15:58:42

  Minio - Użyszkodnik

Minio
Użyszkodnik
Skąd: Poznań, Polska
Zarejestrowany: 2007-12-22
Serwis

Re: bash i liczby zmiennoprzecinkowe

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

 

#3  2010-01-07 15:59:57

  bercik - Moderator Mamut

bercik
Moderator Mamut
Skąd: Warszawa
Zarejestrowany: 2006-09-23
Serwis

Re: bash i liczby zmiennoprzecinkowe

obcinaj tak aby zostalo tylko to co jest przed kropka czyli:

Kod:

cputot=`echo $cputot | cut -f1 -d.`

"Wszyscy wiedzą, że czegoś zrobić nie można. Ale przypadkowo znajduje się jakiś nieuk, który tego nie wie. I on właśnie robi odkrycie." (A.Einstein)

Offline

 

#4  2010-01-07 16:59:20

  TaZz - Użytkownik

TaZz
Użytkownik
Zarejestrowany: 2009-12-29

Re: bash i liczby zmiennoprzecinkowe

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

Kod:

cputot=`echo 9.9 |tr . ,`

czyli zmiane . na , a przy wyniku ostatecznym odwrotnie
caly kod :

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

 

#5  2010-01-07 19:32:15

  Minio - Użyszkodnik

Minio
Użyszkodnik
Skąd: Poznań, Polska
Zarejestrowany: 2007-12-22
Serwis

Re: bash i liczby zmiennoprzecinkowe

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

 

#6  2010-01-07 20:57:29

  TaZz - Użytkownik

TaZz
Użytkownik
Zarejestrowany: 2009-12-29

Re: bash i liczby zmiennoprzecinkowe

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

 

#7  2010-01-07 22:48:29

  bercik - Moderator Mamut

bercik
Moderator Mamut
Skąd: Warszawa
Zarejestrowany: 2006-09-23
Serwis

Re: bash i liczby zmiennoprzecinkowe

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)


"Wszyscy wiedzą, że czegoś zrobić nie można. Ale przypadkowo znajduje się jakiś nieuk, który tego nie wie. I on właśnie robi odkrycie." (A.Einstein)

Offline

 

#8  2010-01-07 23:07:46

  Minio - Użyszkodnik

Minio
Użyszkodnik
Skąd: Poznań, Polska
Zarejestrowany: 2007-12-22
Serwis

Re: bash i liczby zmiennoprzecinkowe

Wcale nie trzeba używać innej zmiennej.

Kod:

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

Kod:

if [ $(echo $cputot |cut -f 1 -d .) -lt 29 ]; then ...

Offline

 

#9  2010-01-07 23:29:08

  bercik - Moderator Mamut

bercik
Moderator Mamut
Skąd: Warszawa
Zarejestrowany: 2006-09-23
Serwis

Re: bash i liczby zmiennoprzecinkowe

mozna i tak ... ale to bardziej ciezkie rozwiazanie w stosunku od osobnej zmiennej (bo operacja obcinania musi byc powielona iles tam razy) ...


"Wszyscy wiedzą, że czegoś zrobić nie można. Ale przypadkowo znajduje się jakiś nieuk, który tego nie wie. I on właśnie robi odkrycie." (A.Einstein)

Offline

 

#10  2010-01-08 00:09:20

  Minio - Użyszkodnik

Minio
Użyszkodnik
Skąd: Poznań, Polska
Zarejestrowany: 2007-12-22
Serwis

Re: bash i liczby zmiennoprzecinkowe

Tak, chociaż myślę że w tym przypadku narzut na zasoby będzie niezauważalny.

Offline

 

#11  2010-01-08 01:32:12

  TaZz - Użytkownik

TaZz
Użytkownik
Zarejestrowany: 2009-12-29

Re: bash i liczby zmiennoprzecinkowe

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

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Możesz wyłączyć AdBlock — tu nie ma reklam ;-)