N.Bokov: Einer Bourne-Shell-Funktion Zeichenkette übergeben.

Hallo,

wie kann ich einer Bourne-Shel-Funktion eine Zeichenkette übergeben?

Mein Programm:

  
# Schreibt die Daten in Logfile  
#  
# $1: Markierung (z.B. === B === )  
# $2: Zeilennummer  
# $3: Meldung  
# $4: Logfile-Name  
# $5: Aktivierung-Flag zum Loggen  
#  
log_this () {  
  
   # Parameter checken {  
   #  
   if [ -z $1 -o -z $2 -o -z $3 -o -z $4 -o -z $5 ]; then  
  
      print ">>> $1"  
      print ">>> $2"  
      print ">>> $3"  
      print ">>> $4"  
      print ">>> $5"  
  
   else  
  
      print "::: $1"  
      print "::: $2"  
      print "::: $3"  
      print "::: $4"  
      print "::: $5"  
  
      # Loggen, falls aktiv ist {  
      #  
      if [ $5 >= 1 ]; then  
  
         print "$1: [$2] $3" >> $4  
  
      fi  
      #  
      # Loggen, falls aktiv ist }  
  
   fi  
   #  
   # Parameter checken }  
  
   return  
}  

Ich übergebe Parameter:

  
# $STRIPLINE: "== LOG =="  
# $LINENO: Aktuelle Zeilennummer  
# $RetVal: Eine Zahl  
# $FILE_BACKUP_LOG: "logile.log"  
# $LOG: 1  
#  
log_this $STRIPLINE $LINENO $RetVal $FILE_BACKUP_LOG $LOG  

Es kommt leider in der Zeile, wo ich die Funktion aufrufe die Fehlermeldung:

[: 1: unexpected operator/operand

Danke für die Tipps.

  1. Hallo!

    [: 1: unexpected operator/operand

    Im Prinzip machst Du es schon ganz richtig, allerdings solltest Du Deine if-Abfrage noch einmal prüfen: die Parameter darin solltest Du in double quotes stellen, sonst kann es passieren, dass bash "if [ -z  -o..." daraus macht und die Abfrage nicht korrekt bearbeiten kann (if [ -z "" ... klappt besser).

    Gruß, LX

    --
    RFC 1925, Satz 2: Egal, wie fest man schiebt, ganz gleich, wie hoch die Priorität ist, man kann die Lichtgeschwindigkeit nicht erhöhen.
  2. Fehler ist in der if-Abfrage (blöd!):

      
    # Loggen, falls aktiv ist {  
    #  
    if [ $5 >= 1 ]; then  
      
     print "$1: [$2] $3" >> $4  
      
    fi  
    #  
    # Loggen, falls aktiv ist }  
    
    

    Es muss so sein:

      
    # Loggen, falls aktiv ist {  
    #  
    if [ $5 -ge 1 ]; then  
      
     print "$1: [$2] $3" >> $4  
      
    fi  
    #  
    # Loggen, falls aktiv ist }  
    
    

    Aber die Zeichenkette kann ich immer noch nicht übergeben, weil die Leer-Zeichen sind die Trennzeichen und meine Zeichenkette "== LOG ==" wird in 3 Zeichenketten zerlegt: "==", "LOG" und "==".

    Es gibt die interne Variable IFS, die diese Trennzeichen ansteuert aber dann bekomme ich diese Trennzeichen als Teil meiner Zeichenkette. D.h., wenn ich IFS="," definiere, so bekomme ich "== LOG==,".

    Danke für weitere Tipps.

    1. Hi,

      IFS würde ich an dieser Stelle nicht generell ändern, sondern vor der Übergabe in dem in Frage kommenden String mit Sed die Leerzeichen durch ein Zeichen ersetzen, das im String nicht vorkommen kann, und diese in der Funktion auf die gleiche Art und Weise wieder in Leerzeichen umwandeln.

      Oder Du übergibst diesen String als letzten Parameter, filterst zunächst alle anderen vorher mit dem Shift-Befehl aus (und speicherst sie natürlich zwischen) und fasst dann die restlichen mit $* zusammen.

      Gruss
      Stefanie

    2. Ich korrigiere mich; IFS könntest Du auch ganz gut nutzen.

      Es gibt die interne Variable IFS, die diese Trennzeichen ansteuert aber dann bekomme ich diese Trennzeichen als Teil meiner Zeichenkette. D.h., wenn ich IFS="," definiere, so bekomme ich "== LOG==,".

      Nein, der Trick dabei ist ja gerade nicht, das IFS statt des Leerzeichens in die Strings selber einzufügen, sondern die Leerzeichen an der Stelle durch das geänderte IFS zu ersetzen, in denen sie als Trenner zwischen den einzelnen Paramtern fungieren. Die übergebenen Strings bleiben wie sie sind, mit Leerzeichen, aber für die verarbeitende Funktion wirken sie nicht mehr als Trenner.

      So oder ähnlich:

      parameter1="x y z"
      parameter2="bla"
      parameter3="blub"

      ifsBackup=$IFS
      IFS=$'\t'

      VerarbeitendeFunktion $parameter1$IFS$parameter2$IFS$parameter3

      IFS=$ifsBackup

  3. Hallo alle zusammen,

    diese Problematik:

    log_this $STRIPLINE $LINENO $RetVal $FILE_BACKUP_LOG $LOG

      
    hat eine einfache Lösung in Anführungszeichen:  
      
    ~~~perl
      
    log_this "$STRIPLINE" "$LINENO" "$RetVal" "$FILE_BACKUP_LOG" "$LOG"  
    
    

    Danke für Eure Aufmerksamkeit.