2012-11-30 23 views
32

Mam poniżej kod w moim skrypcie powłoki, który będzie nadal spał, jeśli nie znajdzie żadnego pliku. I śpi przez pół godziny, ale obecnie nie mam żadnego licznika, jak tylko wykonuję poniższy kod 20 razy, a następnie kończę program, jeśli pliki nadal nie istnieją (czyli nic nie robię po 20 sprawdzeniach i kończę pełny skrypt).Dodawanie licznika w skrypcie powłoki

Jaki jest najlepszy sposób na wykonanie tego problemu? Tak, że jestem również świadomy, patrząc na e-maile, które próbował 20 razy.

Mam nadzieję, że jestem wystarczająco jasny.

while true; do 
    if /home/hadoop/latest/bin/hadoop fs -ls /apps/hdtech/bds/quality-rt/dt=$DATE_YEST_FORMAT2 then 
     echo "Files Present" | mailx -s "File Present" -r [email protected] [email protected] 
     break 
    else 
     echo "Sleeping for half an hour" | mailx -s "Time to Sleep Now" -r [email protected] [email protected] 
     sleep 1800 
    fi 
done 

Odpowiedz

54

Oto jak można zaimplementować licznik:

counter=0 
while true; do 
    if /home/hadoop/latest/bin/hadoop fs -ls /apps/hdtech/bds/quality-rt/dt=$DATE_YEST_FORMAT2 then 
     echo "Files Present" | mailx -s "File Present" -r [email protected] [email protected] 
     exit 0 
    elif [[ "$counter" -gt 20 ]]; then 
     echo "Counter: $counter times reached; Exiting loop!" 
     exit 1 
    else 
     counter=$((counter+1)) 
     echo "Counter: $counter time(s); Sleeping for another half an hour" | mailx -s "Time to Sleep Now" -r [email protected] [email protected] 
     sleep 1800 
    fi 
done 

Niektóre Objaśnienia:

  • counter=$((counter+1)) - to w jaki sposób można zwiększyć licznik. Opcja $ dla counter jest w tym przypadku opcjonalna wewnątrz podwójnych nawiasów.
  • - to sprawdza, czy $counter nie jest większe niż 20. Jeśli tak, wyprowadza odpowiedni komunikat i wył ± czy się z pętli while.
+0

Dzięki sampson za sugestię. Zamiast robić 'break' w' elif' jest jakikolwiek sposób mogę opuścić skrypt? Dlaczego o to pytam, ponieważ po 'done' linii mam dużo więcej kodu do wykonania, więc został on wykonany tylko wtedy, gdy pliki były obecne, ale po dodaniu tej kontroli licznika, nie chcę wykonywać tego kodu również po sprawdzanie 20 razy, czy pliki nadal nie istnieją. – ferhan

+0

@ TechGeeky Aby wyjść z samego skryptu, wykonaj 'exit 0' (jeśli kończysz zgodnie z oczekiwaniami) lub' exit 1' (jeśli kończysz i chcesz wskazać, że wystąpił jakiś błąd) –

+0

Wypróbowałem powyższy kod i otrzymuję wyjątek 'counter = $ ((counter + 1))' ten wiersz jako '$' nieoczekiwany. Dlaczego tak jest? Mam powyższy skrypt jako 'sh -x test1.sh' – ferhan

4

Spróbuj tego:

counter=0 
while true; do 
    if /home/hadoop/latest/bin/hadoop fs -ls /apps/hdtech/bds/quality-rt/dt=$DATE_YEST_FORMAT2 then 
     echo "Files Present" | mailx -s "File Present" -r [email protected] [email protected] 
     break 
    elif [[ "$counter" -gt 20 ]]; then 
     echo "Counter limit reached, exit script." 
     exit 1 
    else 
     let counter++ 
     echo "Sleeping for another half an hour" | mailx -s "Time to Sleep Now" -r [email protected] [email protected] 
     sleep 1800 
    fi 
done 

Wyjaśnienie

  • break - jeśli pliki są obecne, będzie przerwa i pozwalają skrypt do przetwarzania plików.
  • [[ "$counter" -gt 20 ]] - jeśli zmienna licznika jest większa niż 20, skrypt zakończy działanie.
  • let counter++ - zwiększa licznik o 1 przy każdym przejściu.
Powiązane problemy