Verständnisfrage zu folgendem Skript...

E

-eraz-

Tripel-As
Ich suche nach einem Codestück, dass eine IP Adresse auf deren Gültigkeit prüft. Tante Google hat folgendes gefunden:
Code:
#!/bin/bash
ip=$1
stat=1

if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
  OIFS=$IFS
  IFS='.'
  ip=($ip)
  IFS=$OIFS
  [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
  && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
     stat=$?
fi

if [ $stat = 0 ]; then
  echo "ip ok"
else
  echo "ip nicht ok"
fi
Funktioniert super, hab nur nicht ganz verstanden wie es genau funktioniert. Vielleicht möchte mir jemand helfen folgende Unklarheiten zu beseitigen :)
  1. Warum steht die if Abfrage in doppelten eckigen Klammern, was bewirkt das?
  2. Warum steht am Ende von "~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" ein Dollar Zeichen? Ist das eine Kommandosubstitution?
  3. Wie funktionieren die Variablen OIFS und IFS? Ich sehe nicht das die irgendwo eingesetzt werden??
  4. Die Zahl in der einzelnen Array Variable wird ebenfalls in eckigen Klammern abgefragt und ohne if davor. Warum funktioniert das überhaupt?
 
Hallo -eraz-,
ich versuche es mal kurz und knapp:
1.) Doppelte eckige Klammern werden für spezielle Muster-Tests verwendet. Der IP-String wird mit dem Muster auf der rechten Seite verglichen.
2.) Regex ... ^ am Anfang ... $ am Ende
3.) IFS ist eine globale Variable (Internal Field Separator) die in OIFS gesichert und danach zurück gesetzt wird. Das wäre wichtig, wenn man im Script auf den ursprünglichen Wert von IFS angewiesen wäre.
4.) Das ist gut gelöst. $1 wird zuerst in ip gespeichert. Später wird IFS auf Punkt gesetzt - der Trenner bei der IP. Dann wird der Inhalt von ip ($ip) der Variablen ip neu zugeordnet. Dank IFS sind das nun (je nach Eingabe) 4 Zahlengruppen. Auf dieses Array kannst Du nun mit $ip[0] usw. zugreifen.

Vielleicht hat ja noch jemand Korrekturen oder Ergänzungen für Dich ...

Gruß zst
 
Aha, alles Neuland für mich... ^^
Vielen Dank für die Erklärung... das heisst die Variable $IFS kann man als Trenner in einem Array verwenden? Und diese wird nur aus dem Grund in $OIFS geschrieben um die ursprüngliche $IFS später wiederherstellen zu können?
 
Und diese wird nur aus dem Grund in $OIFS geschrieben um die ursprüngliche $IFS später wiederherstellen zu können?
Korrekt!

IFS dient dem Trennen von Feldern (Trennung von Expandierungen). Sehr nützlich bei Arrays und beim Gebrauch von read. Aber es gibt sicher noch zahlreiche andere Ideen dafür.

Gruß zst
 
Ja, so ist das. OIFS dient nur dazu, dass das Skript auch woanders eingefügt werden könnte, damit vorher und nachher die Umgebungsvariablen gleich bleiben.
 
Oder ohne IFS
ich kann grep glaube ich nicht auf eine Variable anwenden (oder?)deshalb hier mit echo davor
Code:
#!/bin/bash
if [ "$(echo $1 | grep -E '\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b')" != "" ] 
 then 
      echo "IP OK"
 else
      echo "IP nicht OK"
fi
 

Ähnliche Themen

NAS-Drive Mount in Bash-Script über crontab

Verständnisfrage zu RegExps

Verschlüsseltes Backup-Script mit rsync

HandbrakeCLI Shell Skript

Shell Skript beschleunigen

Zurück
Oben