BASH, SED, Returncode

takidoso

Erfahrenes Mitglied
Hallo und Halli,

irgendwie weiß ich nicht genau wie ich es anstellen soll...
Habe quasi 2 Fragen:
1)
Zunächst mal möchte ich mit SED eine Startscript manipulieren dabei sind eine Zeile an der richtigen Stelle hinzuzufügen und das ein oder andere zu löschen.
Es hatte eigentlich sogar schonmal geklappt, wollte ich aber dann einen String der min meinem gesammt script öfters vorkommt in einer Variablen speichern und in dem einen SED befehl unterbringen, garbled mir SED.

hier mein momentaner Code, der nicht funktioniert
Code:
...
     typeset log4jLibAddition='  CLASSPATH="${CLASSPATH}:${APP_HOME}/lib/log4j-1.2.15.jar"'
     
     sed "/CLASSPATH=\"\.\/bin\"/a\
     ${log4jLibAddition}" "$startScript"   \
     | sed '/# Sonstige benötigte Jar.s von Fremdherstellern/d'         \
     | sed '/JAVAPROPS="${JAVAPROPS} -Djava.util.logging.config.file/d' \
     | sed '/${log4jLibAddition}/d' > "$startScript.$$"
     rc=$?
     if [ $rc -eq 0 ]
     then
        mv "$startScript.$$" "$startScript"
        rc=$?
     fi
...

hier soll nach einer Zeile die CLASSPATH="./bin" beinhaltet die Zeile CLASSPATH="${CLASSPATH}:${APP_HOME}/lib/log4j-1.2.15.jar" eingefügt werden und andere bestimmte Zeilen gelöscht.
Wenn ich statt der Gänsefüße (") nur Hochkommas (') setze wird mir die Variable log4jLibAddition nicht aufgelöst, jedoch habe ich dann offenbar ein funktionierendes SED-Statement, welches mir natürlich nur wörtlich ${log4jLibAddition} einfügt.

2) Ich frage zwar brav den returnCode ab, jedoch scheine ich nur den Returncode des letzten SED-Statements damit zu bekommen und nicht das erste, welches schief geht.
Gibt es da eine Technik den RC von einem jeden SED-Statement zu bekommen, oder noch besser von dem Gesamtausdruck?
Eine Idee die ich da hätte keine Pipes, sondern lauter Dateien zu verwenden, aber ist das nicht etwas Performancelastig?

Für gute Vorschläge bin ich echt dankbar

Takidoso
 

takidoso

Erfahrenes Mitglied
Hallo nochmal,
habe nun nach endlichen Recherchieren und Probieren folgende funktionierend Lösung ausgetüftelt:

Code:
########################################################################################
# Fügt in angegebener Datei die Zeile für die log4j-Bibliothek hinzu
# und löscht eine veraltete Kommentarzeile und eine veraltete Systempropertyzeile,
# die den java-standardlogger berücksichtigte
#
# MQB-Instanzverzeichnisse
# 
#  Parameter:
#   1. Startscript-Datei die es gilt anzupassen
#   
#   
########################################################################################
function editStartScript ()
{
  typeset rc=0  
  typeset startScript=$1
  typeset log4jLibAddition='CLASSPATH="${CLASSPATH}:${APP_HOME}/lib/log4j-1.2.15.jar"'
  
  grep "$log4jLibAddition" "$startScript" > /dev/null
  
  if [ $? -ne 0 ]
  then
     echo "try to edit $startScript "
     sed  '
          /CLASSPATH=\"\.\/bin\"/a\
  '"${log4jLibAddition}"'  
          /# Sonstige benötigte Jar.s von Fremdherstellern/d
          /JAVAPROPS="${JAVAPROPS} -Djava.util.logging.config.file/d
          /${log4jLibAddition}/d' <"$startScript" > "$startScript.$$"
     rc=$?
     if [ $rc -eq 0 ]
     then
        mv "$startScript.$$" "$startScript"
        rc=$?
     fi
  else
     echo "editing of $startScript not necessary, because obviously it was done before"
  fi
  
  return $rc
}

Puhh, das war eine Propiererei...

ciao

Takidoso