• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] Variablen setzen (Variablenexpansion)

A

Anonymous

Gast
Hallo zusammen,

ich wollte mir eigentlich nur ein kleines Auswertungsscript schreiben, komm aber jetzt nach langer Recherche überhaupt nicht weiter ...

Mein Ziel war es eine schöne Zusammenfassung nach Herkunftsland für automatisch gesprerrte IPs zu bekommen ...
So und hier der Ausschnitt, bei dem ich jetzt nicht weiterkomme:
Code:
 # Whois-Aufloesung nach Laendern
  if `whois $(sed -ne ''$ZEILENNUMMER'p' $INPUTFILE) | grep -i country > /dev/null`
  then
    COUNTRY=$(whois $(sed -ne ''$ZEILENNUMMER'p' $INPUTFILE) | grep ountry | awk '{print $2}')
    if $(grep -i $COUNTRY $OUTPUTFILE > /dev/null)
    then
      echo "Land ist schon aufgetreten."
      $COUNTRY=$(expr ${!COUNTRY} + 1)
      echo "Das Land $COUNTRY ist schon ${!COUNTRY} aufgetaucht."
    else
      echo "Land ist noch nicht aufgetreten und wird hinzugefuegt."
      echo "$COUNTRY" >> $OUTPUTFILE
      $(echo $COUNTRY)=1
    fi
  else
    echo "Schon $NOCOUNTRY Eintraege ohne Laenderinformation gefunden."
    NOCOUNTRY=`expr $NOCOUNTRY + 1`
  fi

Das das Ganze bestimmt viel schöner geht, mag sein - aber sind halt erst meine kleinen Einstiege in die Bashprogrammierung ...

Das Problem ist, dass immer wenn ich Folgendes ausführe
Code:
$COUNTRY=$(expr ${!COUNTRY} + 1)
das kommt ...
Code:
bash: DE=3: command not found
COUNTRY ist hier DE und DE hat den Wert 2

Vielleicht habt ihr eine Idee ... ich hab jetzt ne Blockade ;)

Mit freundlichen Grüßen
Mercedesdriver :)
 
Hallo

verändere
Code:
$COUNTRY=$(expr ${!COUNTRY} + 1)
mal nach
Code:
COUNTRY=$(expr ${!COUNTRY} + 1)

Dann müsste es gehen.


Gruß Peter
 
OP
A

Anonymous

Gast
Schon einmal vielen Dank - nur das ich das ja glaube ich garnicht haben möchte ...

Ich möchte das DE, dass in der Variablen COUNTRY temporär gespeichert ist (beim nächsten Schleifendurchlauf könnte es ja auch z.B. RU sein), mit einem entsprechendem Wert besetzen. Wenn ich mich nicht irre, würde bei dir die Variable COUNTRY mit dem entsprechenden Wert besetzt, und nicht die Variable DE, die (in diesem Fall) durch $COUNTRY ausgegeben wird.

Mein Vorhaben folgend vielleicht noch einmal verdeutlicht ...
Code:
Ich möchte DE mit 1 belegen, die Variable DE wird mit Hilfe von $COUNTRY "ausgelesen":
$COUNTRY -> DE
$DE -> 1
DE=$(expr $DE + 1) <--- So und da ist das Problem, ich möchte das nämlich ganz allgemein mit COUNTRY lösen ...

Wenn ich mich irre, musst du es schnell sagen ...
Gibt es ansonsten auch noch andere Ideen?


Mit freundlichen Grüßen
Mercedesdriver :)
 

regexer

Advanced Hacker
mercedesdriver schrieb:
Code:
DE=$(expr $DE + 1) <--- So und da ist das Problem, ich möchte das nämlich ganz allgemein mit COUNTRY lösen ...
Das ist ein Problem, das sich in der Bash nicht so elegant lösen lässt. Die einzige Möglichkeit besteht, eval zu verwenden.

Code:
COUNTRY="DE"
eval $COUNTRY=1
eval $COUNTRY=\$\(expr \$$COUNTRY + 1\)
echo $DE

Andere Scriptsprachen haben für soetwas indizierte Arrays, "Hashes" oder wie man das Kind auch immer nennen will...
 
OP
A

Anonymous

Gast
Vielen Dank!
Mit
Code:
eval $COUNTRY=$(expr ${!COUNTRY} + 1)
funktioniert es.

Ich solte vielleicht wirklich mal eine Scriptsprache lernen, mit der man das besser machen kann ...
Hätte da jemand einen Tipp für eine einfache Scriptsprache?

Mit freundlichem Gruß
Mercedesdriver :)
 

regexer

Advanced Hacker
Nilres schrieb:
Zum Beispiel.
Da würde das ganze dann so aussehen:

Code:
#!/usr/bin/perl
$anzahl{"EN"}++;       # Inhalt für EN: 1

$COUNTRY="DE";
$anzahl{$COUNTRY}=1; # Inhalt für DE: 1
$anzahl{$COUNTRY}++; # Inhalt für DE: 2

foreach $COUNTRY (sort (keys (%anzahl))) {
  print "$COUNTRY: $anzahl{$COUNTRY}\n";
}

python wäre sicher auch eine Alternative...
 
Oben