unexpected EOF while looking for matching `"' - bash script

  • I just wrote a bash script and always getting this EOF-Error.

    So here is my script (only works on 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
    

    And here is my error:

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

    terdon Correct answer

    6 years ago

    You can see your problem if you just look at your question. Note how the syntax highlighting is screwed up after line 95:

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

    As the error message tells you, you have an unmatched ". Just remove the extra " from the line above and you should be fine:

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

    Strangely, I had the same problem and it was because I had a `sudo echo ""` line.. Removing the 2 double quotes, leaving `sudo echo` makes it work perfectly.

    @vinzee why would you ever run `echo` with `sudo`? That said, what you describe doesn't make much sense, there must have been something else going on.

    I do `sudo echo` because the script will need `sudo` later in the commands but I want the user to enter his password early on, so that the script does not need his input anymore for a few minutes. And for the bug, I had the same error as seen here, but it was solved by removing the 2 double quotes. Nothing else happened..

    @vinzee you might want to read How do I run a 'sudo' command inside a script?. As for the quotes, there must have been something else. Maybe you had a non-printing character after the quotes that was deleted with them, for instance. Or maybe you had two single quotes and then a double (`echo ''"`) or something like that, but there had to be _something_ since `echo ""` is fine.

    Thanks for the link, you're right. Running `sudo echo` felt a bit weird.. And I'll try again on my linux install tonight and get back to comment here the results.

License under CC-BY-SA with attribution


Content dated before 6/26/2020 9:53 AM