Verständnisfrage zu folgendem Skript...

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von -eraz-, 18.11.2010.

  1. -eraz-

    -eraz- Tripel-As

    Dabei seit:
    27.03.2008
    Beiträge:
    151
    Zustimmungen:
    0
    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?
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. zst

    zst Foren As

    Dabei seit:
    06.09.2006
    Beiträge:
    95
    Zustimmungen:
    0
    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
     
  4. -eraz-

    -eraz- Tripel-As

    Dabei seit:
    27.03.2008
    Beiträge:
    151
    Zustimmungen:
    0
    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?
     
  5. zst

    zst Foren As

    Dabei seit:
    06.09.2006
    Beiträge:
    95
    Zustimmungen:
    0
    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
     
  6. #5 saeckereier, 18.11.2010
    saeckereier

    saeckereier Graue Eminenz

    Dabei seit:
    08.05.2005
    Beiträge:
    1.920
    Zustimmungen:
    0
    Ort:
    Im schönen Norden
    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.
     
  7. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  8. -eraz-

    -eraz- Tripel-As

    Dabei seit:
    27.03.2008
    Beiträge:
    151
    Zustimmungen:
    0
    Hab ich wieder was dazu gelernt, danke :)
     
  9. #7 briXton, 24.11.2010
    briXton

    briXton Grünschnabel

    Dabei seit:
    24.11.2010
    Beiträge:
    7
    Zustimmungen:
    0
    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
    
     
Thema:

Verständnisfrage zu folgendem Skript...

Die Seite wird geladen...

Verständnisfrage zu folgendem Skript... - Ähnliche Themen

  1. Sicherung der Systempartition inkl. Bootloader + ein paar Verständnisfragen

    Sicherung der Systempartition inkl. Bootloader + ein paar Verständnisfragen: Hallo, ich habe 2 Mediacenter-PC im Wohn- und Schlafzimmer in denen jeweils Ubuntu auf einer SSD installiert wurde. Einer läuft mit einem Bios,...
  2. Nginx - Verständnisfrage

    Nginx - Verständnisfrage: Hallo Board, teste zur Zeit Nginx auf einer VM. Bis vor einem php5 (habe die dotdeb Repository eingebunden) Update war ich sehr glücklich damit...
  3. Verständnisfrage zu SSL und namebased virtual Hosts

    Verständnisfrage zu SSL und namebased virtual Hosts: Hallo zusammen, ich arbeite mich gerade durch die Apache Doku durch und habe da eine Verständnisfrage. Dort steht es ist nicht möglich zwei...
  4. Verständnisfrage Videstandards

    Verständnisfrage Videstandards: Hallo Leute, leider wusste ich nicht genau, wo ich meine frage posten sollte, deshalb tue ich das mal an dieser stelle. wenn dies der falsche...
  5. Verständnisfrage "PE-Size" bei Fedora 7

    Verständnisfrage "PE-Size" bei Fedora 7: Hallo. Ich daddel gerade ein wenig mit Filesystemen rum, da ist mir aufgefallen, dass auf meiner 200-GB-Platte die PE-Size 32 MB ist (Filesystem...