EOF imprevisto durante la ricerca della corrispondenza "" '- script bash


38

Ho appena scritto uno script bash e ricevo sempre questo errore EOF.

Quindi ecco il mio script (funziona solo su 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

Ed ecco il mio errore:

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

Risposte:


32

Puoi vedere il tuo problema se guardi solo la tua domanda. Nota come l'evidenziazione della sintassi è rovinata dopo la riga 95:

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

Come ti dice il messaggio di errore, hai un ineguagliato ". Basta rimuovere l'extra "dalla riga sopra e dovresti andare bene:

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

1
Stranamente, ho avuto lo stesso problema ed era perché avevo una sudo echo ""linea .. Rimuovere le 2 virgolette doppie, lasciarlo sudo echofunzionare alla perfezione.
Vinzee,

@vinzee perché mai correre echocon sudo? Detto questo, ciò che descrivi non ha molto senso, ci deve essere stato qualcos'altro in corso.
Terdon

Lo faccio sudo echoperché lo script sarà necessario in sudoseguito nei comandi, ma voglio che l'utente inserisca la sua password in anticipo, in modo che lo script non abbia più bisogno del suo input per alcuni minuti. E per il bug, ho avuto lo stesso errore visto qui, ma è stato risolto rimuovendo le 2 virgolette doppie. Non è successo nient'altro ...
Vinzee,

1
@vinzee potresti voler leggere Come posso eseguire un comando 'sudo' all'interno di uno script? . Per quanto riguarda le citazioni, ci deve essere stato qualcos'altro. Forse hai avuto un carattere non stampabile dopo le virgolette che sono state cancellate con loro, per esempio. O forse hai avuto due virgolette singole e poi una doppia ( echo ''") o qualcosa del genere, ma doveva esserci qualcosa dal momento che echo ""va bene.
Terdon

Grazie per il link, hai ragione. La corsa è sudo echosembrata un po 'strana .. E stasera riproverò di nuovo sulla mia installazione di Linux e torno a commentare qui i risultati.
Vinzee,

4

Questo errore può essere difficile da rintracciare in situazioni reali. Qui fornisco una soluzione per la situazione del mondo reale. Userò la mia sceneggiatura come esempio.

Ho aggiornato il mio script della shell. Durante l'esecuzione ho ricevuto il seguente messaggio di errore:

/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

Questa è l'ultima riga che ha una coppia di virgolette doppie.

Normalmente, controllo il mio script di shell ogni volta che lo modifico. Questa volta, ho aspettato un giorno e ho dimenticato dove avevo apportato modifiche. Il problema si è verificato ovunque prima di questa linea (1508). Il problema è che anche io ho commentato la riga 1508

#elif [ "$project" ]; then

il boia ha ancora detto che la linea 1508 ha dei problemi.

Successivamente ho realizzato una copia dello script di shell originale. Eliminare un sacco di codice dal basso. Quindi convalidare il mio codice con il seguente comando

bash -n mysbashscript

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

Ora il mio file è 1/3 della dimensione originale. Ho subito visto il problema:

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

Per alcuni motivi, il "inside {} non corrispondente non viene acquisito dal parser della shell. Qui è dove il parser della shell può essere ulteriormente migliorato.

L'algoritmo più veloce per trovare il problema è eliminare metà del codice dal basso, se l'errore di sintassi scompare, allora è in questa metà. Se l'errore di sintassi è ancora presente, il problema si verifica nella metà superiore.

Se il problema nella seconda metà, annulla elimina. Ripeti questo processo. È possibile restringere a una dimensione inferiore per trovare l'origine del problema.

Quando si elimina il codice, è necessario eliminare un'intera sezione del codice. Ad esempio l'intera funzione.

Puoi usare bash -n nome script o semplicemente eseguire direttamente lo script. Entrambi dovrebbero funzionare.


1
"Per qualche motivo, l'impareggiabile" dentro {} non viene catturato dal parser della shell. "È solo perché sintatticamente, viene abbinato, sulla linea 1508? Cioè la stringa aperta sulla linea 500 viene chiusa sulla linea 1508, e poi un'altra la stringa viene aperta sul 1508 e non viene mai chiusa.
phil

Non ho studiato il comportamento di citazione di bash. Bash potrebbe avere una citazione a più righe "line1 \ nline2" Ricordo che nella shell fai una citazione a più righe con << ENDMARK. Forse ora puoi usare direttamente la doppia virgoletta per citare più righe. Questa funzione rende il debug davvero difficile.
Kemin Zhou
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.