Yes, meget spændende lille projekt
Jeg tror jeg har rettet det hele til, og nu hvor det næsten er færdigt, har jeg skrevet nogle kommentarer ind i koden. Hvis det er, så må du gerne give feedback på kommentarerne, så jeg ved om de ramte rigtigt eller ej.
Kode: Vælg alt
#!/bin/bash
########################################################################################
#
# INDSTILLINGER
#
# Hvis det ønskes, så kan der gemmes en kopi, af det som terminalen viser, i fil.
# Filen vil hedde det samme som scriptet med *.log bagefter, og blive lagt i samme mappe.
# (Af)kommentér følgende linie hvis det ønskes, og sæt den til "yes":
USE_LOG="yes"
#
# Hvor længe skal der i sekunder ventes imellem hvert ping?
# (skal være ét helt tal, og intet andet)
PING_WAIT=6
#
########################################################################################
#
# Lad os rydde skærmen først
clear
# $2 betyder variable nr. 2 efter scriptnavnet, og hvis den ikke er sat,
# så er vi nødt til at afbryde, for uden 2 variabler (server der skal pinges og antal pings),
# er der ingen pointe i at fortsætte.
if [ "$2" = "" ] ; then
# De 2 echo'er vises i terminalen
echo "Adresse eller ønsket antal pings mangler"
# $0 bliver erstattet af scriptnavnet.
echo "Bruges [sh $0 www.domæne.tld 6]"
# Og denne her afslutter scriptet med fejl 10.
# Alle exit-koder udover 0 betyder fejl, imens 0 betyder succes.
exit 10
fi
# Variable 1 ($1) = den side der skal pinges.
# Og variable 2 ($2) = antal af pings der skal udføres.
URL=$1
ROTATE=$2
# En while-konstruktion kører så længe som en bestemt ting er sand, og i dette script,
# er det så længe variablen $ROTATE ikke er lig nul.
while [ "$ROTATE" -ne "0" ] ; do
# Denne her er lidt speciel, for der sker flere ting:
# For det første er hele kommandoen pakket ind, sådan så resultatet af ping gemmes i en variabel.
# Dernæst betyder den lodrette streg ( | ) at resultatet skal køres videre til det næste program der kaldes,
# her programmerne grep og awk. I sidste ende betyder det, at det eneste som gemmes i vaiablen $P
# er pingtiden.
P=$(ping -c 1 $URL | grep time | awk '{ print $8 }' | grep time)
# Og nu skal vi så vide om ping afsluttede med succes eller ej, og det gør man
# ved at vurdere dens exit-status, som automatisk gemmes i variablen $?. Igen er nul succes,
# imens alt andet end nul er fejl. Ved fejl afvikles kun den første blok (indtil else),
# og ved succes afvikles kun den anden blok (fra else til fi).
if [ "$?" -ne "0" ] ; then
echo "$(date +%k:%M:%S) - $URL kunne ikke nås -"
# Denne her if finder ud af om logging til fil ønskes, og kun hvis
# $USE_LOG="yes", bliver der skrevet til loggen.
if [ "$USE_LOG" = "yes" ] ; then
# Variablen $PWD som der bruges her, er = Print Working Directory,
# og $0 er jo lige scriptets navn, så $PWD/$0 giver den komplette sti til scriptet.
echo "$(date +%k:%M:%S) - $URL kunne ikke nås -" >> "$PWD/$0.log"
fi
else
# Dette skrive som sagt ved succes
echo "$(date +%k:%M:%S) - Pingede $URL på $P ms. ($ROTATE ping mangler)"
# Og ligesom ved fejl, så skal loggen kun skrives hvis den er sat
if [ "$USE_LOG" = "yes" ] ; then
echo "$(date +%k:%M:%S) - Pingede $URL på $P ms." >> "$PWD/$0.log"
fi
fi
# Hver gang while har kørt 1 gang, så trækker vi 1 fra variablen $ROTATE, sådan så vi når nul på et tidspunkt.
ROTATE=$((ROTATE-1))
# Denne her er også lidt speciel, men pointen er, at hvis vi er færdige med at pinge,
# så gider vi ikke vente X antal sekunder på at scriptet afslutter.
# Så hvis variablen $ROTATE er nul, så afslutter vi while med det samme.
if [ "$ROTATE" -ne "0" ] ; then
# Sleep bestemmer hvor længe der ventes imellem hvert ping,
# og den vil bruge tallet fra variablen $PING_TIME som vi satte oppe i hovedet.
sleep $PING_WAIT
else
# break afslutter while med det samme.
break
fi
# Og til sidst, som nævnt højere oppe, så afslutter vi hele scriptet med succes
done
exit 0