2 pliki z sumami, porównanie ich w Bashu


(matiit) #1
#!/bin/bash

wget -O - http://xx.xx.xx.xx/index.html | md5sum >> weryfikacja

sleep 3

wget wget -O - http://xx.xx.xx.xx/index.html | md5sum >> weryfikacja1

if [?]

then

	Wysłanie SMS'a

              rm -r weryfikacja*

              ponowne wykonanie pętli // jak?

else

	sleep 3600

              weryfikacja*

              ponowne wykonanie pętli // jak?

fi

Nie wiem jak porównać plik weryfikacja i weryfikacja 1

I jak ponownie wywołać pętle?

Program ma chodzić na shellu calutki czas... i jeśli pliki są różne to wyyłą smsa (to wiem jak zrobić)


(Sawyer47) #2

Nie mam dużej doświadczenie co do basha, ale na czuja pomyślałem, że do porównywania służyło coś z compare w nazwie, pierwsza próba: cmp - zgadłem :).

A co do użytej pętli... jak sam napisałeś - pętli. Wystarczy while Warunek? http://www.dief.republika.pl/while.html

while Warunek (jeżeli cały czas to może być while 1 ?)

do  

	cmp_result=`cmp plik1 plik2`


	if [-z "$cmp_result"] # czyli jeżeli tekst zwrócony przez cmp jest pusty to są identyczne

	then

		echo "Pliki pasują"

	else

		echo "Nie pasują"

	fi

done

Jak już pisałem, nie mam doświadczenia w bashu, ale powinno działać.


(matiit) #3

Kurde... To pobieranie plików też trzeba by wrzucić w pętle... i wtedy sprawdzanie też :confused:


(Sawyer47) #4

Nie o to Ci chodziło?


(matiit) #5

Wtedy kiedy mają się pobierać pliki?

W skrócie skrypt ma sprawdzać co godzinę czy podstrona (bo index.html to nie jest prawdziwa nazwa) się zmieniła i wysyłać SMS'a, i znów sprawdzać...


(Sawyer47) #6

No to ten kod który zaproponowałem powinien działać. A skoro ma chodzić cały czas to chyba można zastosować nieskończoną pętlę, przynajmniej inne rozwiązanie nie przychodzi mi do głowy.


(matiit) #7
#!/bin/bash

while

do 

wget -O - http://adres | md5sum >> weryfikacja

sleep 3

wget wget -O - http://adres | md5sum >> weryfikacja1

cmp_result=`cmp weryfikacja weryfikacja1`

if [-x "$cmp_result"]

then

	#Wysylanie SMS'a 	

              sleep 3600

else

	sleep 3600

fi

done

Tyle że bash wypluwa że 1 command not found :o Tak poza tym to było by chyba takie coś OK


(Sawyer47) #8

w test przełącznik -z , a nie -x

-x, za manem: -x FILE, FILE exists and execute (or search) permission is granted

-z STRING sprawdza, czy STRING ma zerową długość, a jeżeli pliki są identyczne to cmp nie zwraca nic.

W tym widzę błąd.


(matiit) #9

No tak. Tylko wypluwa syntax error:

./skryptas.sh: line 22: syntax error near unexpected token `else'

./skrypt.sh: line 22: `else'

http://wklej.org/id/ab7164d560

Nie wiem może w bashu jak w pythonie, liczą się wcięcia? Ale nigdzie o tym nie czytałem...


(Sawyer47) #10

Trzeba dodać składnie testa również przy 1, powinno działać:

while [1]

do

	wget -q -O - http://www.cppreference.com/index.html | md5sum > weryfikacja

	sleep 3

	wget wget -q -O - http://www.cppreference.com/index.html | md5sum > weryfikacja1


	cmp_result=`cmp weryfikacja weryfikacja1`

	if [-z "$cmp_result"]

	then

		echo "Takie same"

	else

		echo "hrrrr..."

	fi

done

Powinno działać :slight_smile:

edit: Aha dopiero mi się przypomniało, jeszcze kwestia tego co zwraca md5sum, domyślnie dołącza nazwę pliku, więc to trzeba wziąć pod uwagę. No i w sumie można by nie wrzucać tej sumy do pliku, tylko do zmiennej.

//edit2: A sorry przy zastosowania pipe'a nie dołącza nazwy pliku, więc tu nazwa nie gra roli.

No ale można pozbyć się tworzenia plików i wynik md5sum wrzucić do zmiennej.


(matiit) #11

Ok działa :slight_smile: Dzięki!

Tylko sobie zdałem sprawę że pliki raczej muszę pobierać w odstępach czasowych :smiley: i porównać plik z przed godziny z plikiem z przed chwili :slight_smile:

Ale to już nie problem.

O tak chyba :slight_smile:

while [1]

do

wget -q -O - http://www.cppreference.com/index.html | md5sum > weryfikacja

sleep 3600

wget wget -q -O - http://www.cppreference.com/index.html | md5sum > weryfikacja1

cmp_result=cmp weryfikacja weryfikacja1

if [-z "$cmp_result"]

then

SMS

rm weryfikacja* #czyszczenie

else

echo "jeszcze raz"

rm weryfikacja*

fi

done

[code]