EOF inesperado ao procurar correspondência '' '- script bash

26

Acabei de escrever um script bash e obter sempre este erro de EOF.

Então aqui está o meu script (só funciona no 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

E aqui está o meu erro:

./coding.sh: line 144: unexpected EOF while looking for matching '"'
./coding.sh: line 147: syntax error: unexpected end of file
    
por SimMac 08.09.2014 / 19:38

2 respostas

27

Você pode ver seu problema se apenas olhar para sua pergunta. Observe como o realce de sintaxe é parafusado após a linha 95:

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

Como a mensagem de erro informa, você tem um " incomparável. Apenas remova o " extra da linha acima e você estará bem:

echo -e "Sorry, an error occurred. You have to run this on OS X"
    
por 08.09.2014 / 19:42
1

Esse erro pode ser difícil de acompanhar em situações reais. Aqui eu forneço uma solução para a situação do mundo real. Vou usar meu script como exemplo.

Atualizei meu script de shell. Ao executá-lo, recebi a seguinte mensagem de erro:

/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

Esta é a última linha que tem um par de aspas duplas.

Normalmente, eu verifico meu shell script toda vez que eu modifico. Desta vez, esperei um dia e esqueci onde fiz a modificação. O problema aconteceu em qualquer lugar antes desta linha (1508). O problema é que até eu comentei a linha 1508

#elif [ "$project" ]; then

o carrasco ainda diz que a linha 1508 tem problemas.

Em seguida, fiz uma cópia do script de shell original. Excluindo um monte de código da parte inferior. Então valide meu código com o seguinte comando

bash -n mysbashscript

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

Agora meu arquivo é 1/3 do tamanho original. Eu imediatamente vi o 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

Por algum motivo, o "dentro {} não correspondido não é capturado pelo analisador de shell. É onde o analisador de shell pode ser melhorado ainda mais.

O algoritmo mais rápido para encontrar o problema, é excluir metade do seu código da parte inferior, se o erro de sintaxe desaparecer, então é nessa metade. Se o erro de sintaxe ainda estiver lá, o problema estará na metade superior.

Se o problema ocorrer na segunda metade, desfaça a exclusão. Repita este processo. Você pode diminuir para um tamanho menor para encontrar a origem do problema.

Ao excluir o código, você precisa excluir uma seção inteira do código. Por exemplo, toda a função.

Você pode usar bash -n scriptname ou apenas executar diretamente o script. Ambos devem funcionar.

    
por 03.08.2018 / 19:31

Tags