[BASH] Przelicznik walut

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
mejdej
Piegowaty Guziec
Piegowaty Guziec
Posty: 6
Rejestracja: 10 mar 2006, 17:06
Płeć: Mężczyzna
Wersja Ubuntu: 8.04
Środowisko graficzne: GNOME
Kontakt:

[BASH] Przelicznik walut

Post autor: mejdej »

siema, kumplowi pisze skrypt w bashu na zaliczenie i mam drobny problem.
zalozenia:
* sposob odpalania 1 ./waluty.sh 10 PLN USD
2 ./waluty.sh 10 (wartosci domyslne)
* pobieranie tabeli kursow walut z nbp.pl/Kursy/KursyA.html
* sprawdzanie czy lista jest aktualna
* przeliczanie walut wg powyzszej tabeli kursow
obmyslilem sobie, ze wgetem sciagne ten plik html. przerobie go sedem, wyluskam wartsoci i jakos policze. no wlasnie. jakos przypisanie mi nie idzie. wyluskalem sobie z tego pliku nr wiersza w ktorym mam podana walute, w nastepnym wierszu mam kurs.
kiedy chce zinkrementowac n (n=n+1) bash wywala mi blad. Pomoze ktos?

Kod: Zaznacz cały

#!/bin/bash
#dozwolona liczba parametrow to 1 albo 3,
#1 to ilosc gotowki, 2 to wejsciowa waluta
#3 to wyjsciowa waluta.
#p.s. bash nie obluguje operacji zmiennoprzecinkowych.


function aktual {
wget www.nbp.pl/Kursy/KursyA.html
if [ KursyA.html -nt tabela.txt ]
then 
rm tabela.txt
mv KursyA.html tabela.txt
echo "Zaktualizowano tabele kursow!"
else echo "Tabela kursów jest aktualna!"
fi

if [ -e KursyA.html ]
then
rm KursyA.html
fi
}

function przetwarzanie {
cat tabela.txt |grep '\<td class=\"bg.\"' |sed -r 's/<td class="bg.">//g' | sed -r 's/<\/td>//g' > tabela1.txt
}

function down {
if [ ! -e tabela.txt ]
then
wget www.nbp.pl/Kursy/KursyA.html
#sciagamy plik z serwera
mv KursyA.html tabela.txt
#zmiana nazwy
echo "##########################################"
fi
}

down
aktual
przetwarzanie

n=$(cat -b tabela1.txt| grep $2 |sed -r 's/1 '$2'//g'|sed -r 's/ //g' |sed -r 's/\t//g'|sed -r 's/\n//g' |sed -r 's/\n//g'|sed -e 's/[[:blank:]]//g')
echo $n
#kurs=$(cat tabela1.txt |head -6 |tail -1)

echo $kurs
Mówienie jest rzeczą głupców, milczenie - tchórzy, a słuchanie rzeczą mędrców.
rack

Odp: [BASH] Przelicznik walut

Post autor: rack »

Po pierwsze wydaje mi się, że powinieneś spróbować odpalic skrypt z debugowaniem #!/bin/bash -x.

Po drugie, o ile rozumiem Twój skrypt $2 odnosi się do PLN ... w takim przypadku

n=$(cat -b tabela1.txt| grep $2 |sed -r 's/1 '$2'//g'|sed -r 's/ //g' |sed -r 's/\t//g'|sed -r 's/\n//g' |sed -r 's/\n//g'|sed -e 's/[[:blank:]]//g')

nie zwraca nic ... $3 czyli USD zwraca linijkę z wartością tabli. Może powinieneś przejrzeć parametry podawane z linii poleceń i ich numerowanie ...

Pozdrawiam
s.wojnowski
Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

Odp: [BASH] Przelicznik walut

Post autor: beluosus »

Zanim zaczniesz dalej pisać... nie ściągaj pliku html tylko xml. Wszystkie kursy są zapisane także w tym formacie. Pod tabelami masz link.
Kurs Linuksa: for i in $(ls /bin); do man $i; done
__________________
http://beluosus.pl/
mejdej
Piegowaty Guziec
Piegowaty Guziec
Posty: 6
Rejestracja: 10 mar 2006, 17:06
Płeć: Mężczyzna
Wersja Ubuntu: 8.04
Środowisko graficzne: GNOME
Kontakt:

Odp: [BASH] Przelicznik walut

Post autor: mejdej »

@rack
n zwraca numer wiersz w ktorym jest 1 USD/1 EUR/etc. dla PLN, rzeczywiscie nic nie zwraca, no ale wiadomo dlaczego. napisalem przykladowo sposob wywolania, powinno byc:
./waluty.sh <kwota> <z_jakiej_waluty> <do_jakiej_waluty>
ja to testowalem dla ./waluty 10 USD na razie bez drugiego parametru i dostawalem n=5

@beluosus
jak zaczynalem pisac mailem 404 po kliknieciu na linka do xml, wiec zaczalem to robic pod html.. ale rzeczywiscie mozna uproscic troche ten skrypt.

@all
bardzo dziekuje za odpowiedzi. sprecyzuje: chodzi mi o przypisanie n wartosci numeru wiersza tak, by nie byla ona uznawana za string (wydaje mi sie ze tak teraz jest). potem mam zamiar ja zinkrementowac przez co uzyskam numer wiersza z kursem. Majac kurs policze ile mam piniedzy i finito :)
ja to widze tak. jakby ktos mial jakis lepszy/łatwiejszy pomysl to prosilbym zeby sie podzielil :) ogolnie malo bawilem se w bashu i wszelka pomoc jest przydatna
Mówienie jest rzeczą głupców, milczenie - tchórzy, a słuchanie rzeczą mędrców.
Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

Odp: [BASH] Przelicznik walut

Post autor: beluosus »

Może coś takiego:

Kod: Zaznacz cały

n=$(grep -m 1 -n $2 tabela1.txt | awk -F: '{print $1}')
let n++
echo $n
Nadużywasz cata z grepem oraz sedy. Można tak: sed 's/1/2/; s/3/4/; ...'
Kurs Linuksa: for i in $(ls /bin); do man $i; done
__________________
http://beluosus.pl/
mejdej
Piegowaty Guziec
Piegowaty Guziec
Posty: 6
Rejestracja: 10 mar 2006, 17:06
Płeć: Mężczyzna
Wersja Ubuntu: 8.04
Środowisko graficzne: GNOME
Kontakt:

Odp: [BASH] Przelicznik walut

Post autor: mejdej »

@beluosus
dziala elegancko :) moglbys mi powiedziec co to robi: awk -F: '{print $1}')
bo jakos tak niezbyt w manie wyczytalem
Mówienie jest rzeczą głupców, milczenie - tchórzy, a słuchanie rzeczą mędrców.
Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

Odp: [BASH] Przelicznik walut

Post autor: beluosus »

'{print $1}' drukuje pierwszy wyraz każdego wiersza. Mówiąc 'wyraz' mam na myśli ciąg, który jest oddzielony separatorem określonym przez -F (w tym wypadku dwukropek). Lepiej poszukaj tutoriala do awk'a, a nie man'a. :)
Kurs Linuksa: for i in $(ls /bin); do man $i; done
__________________
http://beluosus.pl/
mejdej
Piegowaty Guziec
Piegowaty Guziec
Posty: 6
Rejestracja: 10 mar 2006, 17:06
Płeć: Mężczyzna
Wersja Ubuntu: 8.04
Środowisko graficzne: GNOME
Kontakt:

Odp: [BASH] Przelicznik walut

Post autor: mejdej »

chyba tak zrobie :)
skrypt zrobiony (jak kumpel go odda i uzyska zal na karcie to wrzuce), wprawdzie metoda na chama, ale jest i dziala :)
dziekuje za pomoc :)
Mówienie jest rzeczą głupców, milczenie - tchórzy, a słuchanie rzeczą mędrców.
verdorben
Wytworny Kaczor
Wytworny Kaczor
Posty: 470
Rejestracja: 30 mar 2009, 18:00
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: MATE
Architektura: ARM

Odp: [BASH] Przelicznik walut

Post autor: verdorben »

Wszystkie te 3 funkcje zastąpiłbym czymś takim:

Kod: Zaznacz cały

md5przed=`md5sum tabela1.txt | cut -f1 -d" "`

lynx -source http://www.nbp.pl/Kursy/KursyA.html |grep '\<td class=\"bg.\"' |sed 's/.*>\(.*\)<.*/\1/' > tabela1.txt

md5po=`md5sum tabela1.txt | cut -f1 -d" "`

if [ "$md5przed" = "$md5po" ];then
echo "Tabela kursów jest aktualna"
else
echo "Zaktualizowano tabele kursow!"
fi

rm -f KursyA.html

A tu resztę kodu.
perl -e 'print $i=pack(c5,(41*2),sqrt(7056),(unpack(c,H)-2),oct(115),10);'
Inny OS: PLD Linux
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 13 gości