ksh: expression syntax error



  • Hallöchen ich steh grad auf dem Schlauch mit einem shellscript.
    Im Wesentlichen siehts so aus:

    #!/bin/ksh
    #set -x
    
    #($LF_PROJECT_HOME ist in den Umgebungsvariablen gesetzt.)
    mkdir -p $LF_PROJECT_HOME/logs
    PROTOKOLL="$LF_PROJECT_HOME/logs/$(basename $0)_$(date "+%Y-%m-%d_%H%M").log"
    
    if [ -d $LF_PROJECT_HOME/logs ]
    then 
      #Hier der eigentliche Ablauf des Scripts
    fi | tee ${PROTOKOLL}
    

    Beim Abarbeiten des Scripts wird mir dann beim Eintritt in den if-Zweig folgendes ausgespuckt:
    [: install_localserver 11: expression syntax error
    Ich hatte es auch schon so, dass ich statt if-then-fi den gesamten Block in geschweiften Klammern hatte, gefolgt vom pipe und tee, mit der selben Fehlermeldung. Kann mir jemand auf die Sprünge helfen, wie ich den Standardoutput eines ganzen Anweisungsblocks nebenbei in ein logfile abzweigen kann?



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • kannst du das mal auf ein Minimalbeispiel reduzieren?



  • ich hab mal weiter dran rumgefrickelt, es liegt an if-abfragen innerhalb vom Code. Die Zeilenangabe war leider recht irreführend.
    Die Übeltäter sind folgende Zeilen:

    if [ diff $SETENV_LAST $SETENV_AKT != 0 ]
    # ... #
    if [ $(ls $INSTALLDIR | grep ${INSTALLTPL}* | cut -c ${TPL_LEN}-$(expr $TPL_LEN + 2) ) -eq $BUILDNUM ]
    

    Bei beiden Ausdrücken kann der Teil vor dem Vergleichsoperator leer sein - und ein if [ -eq 33b ] ist selbstverständlich nicht korrekt.

    Gibts ne Möglichkeit statt des diff outputs den returncode zu ergattern?

    (btw: warum Linux-Forum? Ich arbeite mit dem MKS-Toolkit unter Windows ;))



  • if diff $SETENV_LAST $SETENV_AKT; then
    :
    fi

    solltest du den return code direkt brauchen, kannst du $? verwenden.



  • wie wär's damit:

    FOO="$(ls $INSTALLDIR | grep ${INSTALLTPL}* | cut -c ${TPL_LEN}-$(expr $TPL_LEN + 2) )"
    if [  -n "$FOO" -a $FOO -eq $BUILDNUM ]
    

    ist FOO leer, dann ist -n erfüllt, also wird die Bedingung hinter -a nicht mehr getestet. "FOO" in Anführungszeichen in der ersten Bedingung sorgt dafür, daß zwischen -n und -a immer etwas steht.



  • habs jetzt so gemacht:

    [ "$(ls $INSTALLDIR | grep ${INSTALLTPL}* | cut -c ${TPL_LEN}-$(expr $TPL_LEN + 2) )" -eq "$BUILDNUM" ] #wenn nix rauskommt steht da if [ "" -eq $BUILDNUM ]
    

    ähnlich beim diff.

    Danke euch 🙂


Anmelden zum Antworten