Einer Bourne-Shell-Funktion Zeichenkette übergeben.
N.Bokov
- programmiertechnik
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.
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
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.
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
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
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.