it-swarm.com.de

unerwartet EOF bei der Suche nach passendem `" '- Bash-Skript

Ich habe gerade ein Bash-Skript geschrieben und bekomme immer diesen EOF-Fehler.

Also hier ist mein Skript (funktioniert nur unter OS X):

#!/bin/bash

#DEFINITIONS BEGIN
en_sq() {
    echo -e "Enabling smart quotes..."
    defaults write NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool true
    status=$(defaults read NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool)
            if [ "$status" = "1" ]
                then
                    echo -e "Success! Smart quotes are now enabled."
                    SUCCESS="TRUE"
            else
                echo -e "Sorry, an error occured. Try again."
            fi
}
di_sq() {
    echo -e "Disabling smart quotes..."
    defaults write NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool false
    status=$(defaults read NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool)
            if [ "$status" = "0" ]
                then
                    echo -e "Success! Smart quotes are now disabled."
                    SUCCESS="TRUE"
            else
                echo -e "Sorry, an error occured. Try again."
            fi
}
en_sd() {
    echo -e "Enabling smart dashes..."
    defaults write NSGlobalDomain NSAutomaticDashSubstitutionEnabled -bool true
    status=$(defaults read NSGlobalDomain NSAutomaticDashSubstitutionEnabled -bool)
            if [ "$status" = "1" ]
                then
                    echo -e "Success! Smart dashes are now enabled."
                    SUCCESS="TRUE"
            else
                echo -e "Sorry, an error occured. Try again."
            fi
}
di_sd() {
    echo -e "Enabling smart dashes..."
    defaults write NSGlobalDomain NSAutomaticDashSubstitutionEnabled -bool false
    status=$(defaults read NSGlobalDomain NSAutomaticDashSubstitutionEnabled -bool)
            if [ "$status" = "0" ]
                then
                    echo -e "Success! Smart dashes are now disabled."
                    SUCCESS="TRUE"
            else
                echo -e "Sorry, an error occured. Try again."
            fi
}
#DEFINITIONS END
#---------------

#BEGIN OF CODE with properties
#This is only terminated if the user entered properties (eg ./sqd.sh 1 1)
if [ "$1" = "1" ]
    then
        en_sq
    Elif [ "$1" = "0" ]
        then
            di_sq
fi

if [ "$2" = "1" ]
    then
        en_sd
        #exit 0 if both, $1 and $2 are correct entered and processed.
        exit 0
    Elif [ "$1" = "0" ]
        then
            di_sd
            #exit 0 if both, $1 and $2 are correct entered and processed.
            exit 0
fi
#END OF CODE with properties
#---------------------------


#BEGIN OF CODE without properties
#This is terminated if the user didn't enter two properties
echo -e "\n\n\n\n\nINFO: You can use this command as following: $0 x y, while x and y can be either 0 for false or 1 for true."
echo -e "x is for the smart quotes, y for the smart dashes."
sleep 1
echo -e " \n Reading preferences...\n"
status=$(defaults read NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool)
if [ "$status" = "1" ]
    then
        echo -e "Smart quotes are enabled."
    Elif [ "$status" = "0" ]
    then
        echo -e "Smart quotes are disabled."

    else
        echo -e "Sorry, an error occured. You have to run this on OS X""
fi

status=$(defaults read NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool)
if [ "$status" = "1" ]
    then
        echo -e "Smart dashes are enabled."
    Elif [ "$status" = "0" ]
    then
        echo -e "Smart dashes are disabled."

    else
        echo -e "Sorry, an error occured. You have to run this on OS X!"
fi

sleep 3
echo -e "\n\n You can now enable or disable smart quotes."

until [ "$SUCCESS" = "TRUE" ]
do
echo -e "Enter e for enable or d for disable:"
read sq

if [ "$sq" = "e" ]
    then
        en_sq
    Elif [ "$sq" = "d" ]
        then
            di_sq
    else
        echo -e "\n\n ERROR! Please enter e for enable or d for disable!"
fi
done
SUCCESS="FALSE"

echo -e "\n\n You can now enable or disable smart dashes."

until [ "$SUCCESS" = "TRUE" ]
do
echo -e "Enter e for enable or d for disable:"
read sq

if [ "$sd" = "e" ]
    then
        en_sd
    Elif [ "$sd" = "d" ]
        then
            di_sd
    else
        echo -e "\n\n ERROR! Please enter e for enable or d for disable!"
fi
done

Und hier ist mein Fehler:

./coding.sh: line 144: unexpected EOF while looking for matching `"'
./coding.sh: line 147: syntax error: unexpected end of file
40
SimMac

Sie können Ihr Problem sehen, wenn Sie sich nur Ihre Frage ansehen. Beachten Sie, wie die Syntaxhervorhebung nach Zeile 95 durcheinander gebracht wird:

echo -e "Sorry, an error occurred. You have to run this on OS X""

Wie die Fehlermeldung zeigt, haben Sie ein unübertroffenes ". Entfernen Sie einfach das zusätzliche " aus der obigen Zeile und es sollte dir gut gehen:

echo -e "Sorry, an error occurred. You have to run this on OS X"
34
terdon

Dieser Fehler kann in realen Situationen schwer zu verfolgen sein. Hier biete ich eine Lösung für reale Situationen. Ich werde mein Skript als Beispiel verwenden.

Ich habe mein Shell-Skript aktualisiert. Bei der Ausführung wurde folgende Fehlermeldung angezeigt:

/somepath/bin/myshellscript: line 1508: unexpected EOF while looking for matching `"'
/somepath/bin/myshellscript: line 1520: syntax error: unexpected end of file

line 1508 Elif [ "$project" ]; then

Dies ist die letzte Zeile mit zwei doppelten Anführungszeichen.

Normalerweise überprüfe ich mein Shell-Skript jedes Mal, wenn ich es ändere. Dieses Mal wartete ich einen Tag und vergaß, wo ich eine Änderung vorgenommen hatte. Das Problem trat irgendwo vor dieser Zeile auf (1508). Das Problem ist, dass sogar ich Gliederung 1508 kommentiert habe

#Elif [ "$project" ]; then

der Shell-Henker sagte immer noch, dass Zeile 1508 Probleme hat.

Als nächstes habe ich eine Kopie des ursprünglichen Shell-Skripts erstellt. Eine ganze Reihe von Code von unten löschen. Überprüfen Sie dann meinen Code mit dem folgenden Befehl

bash -n mysbashscript

mybashscript: line 515: unexpected EOF while looking for matching `"'
mybashscript: line 561: syntax error: unexpected end of file

Jetzt ist meine Datei 1/3 der Originalgröße. Ich habe das Problem sofort gesehen:

497 prepare_alignment() {
498     local projdir=${1:?"did not give project directory"}
499     local samp=${2:?"did not give sample name"}
500     local merged=${3:?"must give merged bam file name} # here is the problem

Aus irgendeinem Grund wird das nicht übereinstimmende " In {} Nicht vom Shell-Parser erfasst. Hier kann der Shell-Parser weiter verbessert werden.

Der schnellste Algorithmus, um das Problem zu finden, besteht darin, die Hälfte Ihres Codes von unten zu löschen. Wenn der Syntaxfehler verschwindet, befindet er sich in dieser Hälfte. Wenn der Syntaxfehler immer noch vorhanden ist, liegt das Problem in der oberen Hälfte.

Wenn das Problem in der zweiten Hälfte auftritt, machen Sie das Löschen rückgängig. Wiederholen Sie diesen Vorgang. Sie können auf eine kleinere Größe eingrenzen, um die Ursache des Problems zu finden.

Wenn Sie Code löschen, müssen Sie einen ganzen Codeabschnitt löschen. Zum Beispiel die ganze Funktion.

Sie können entweder bash -n script_name Verwenden oder das Skript direkt ausführen. Beides sollte funktionieren. (hier ist script_name nur Fooscript oder Barscript zur Veranschaulichung, kein richtiger Skriptname und sollte ein Wort sein).

4
Kemin Zhou