Acabo de escribir un script bash y siempre obtengo este error EOF.
Así que aquí está mi script (solo funciona en 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
Y aquí está mi error:
./coding.sh: line 144: unexpected EOF while looking for matching `"'
./coding.sh: line 147: syntax error: unexpected end of file
sudo echo ""
línea. Quitar las dos comillas dobles, dejarlosudo echo
hace que funcione perfectamente.echo
consudo
? Dicho esto, lo que describe no tiene mucho sentido, debe haber sucedido algo más.sudo echo
porque el script necesitarásudo
más adelante en los comandos, pero quiero que el usuario ingrese su contraseña desde el principio, para que el script ya no necesite su entrada durante unos minutos. Y para el error, tuve el mismo error que se ve aquí, pero se resolvió eliminando las 2 comillas dobles. No pasó nada más ..echo ''"
) o algo así, pero tenía que haber algo ya queecho ""
está bien.sudo echo
sintió un poco extraño. Y volveré a intentarlo en mi instalación de Linux esta noche y volveré a comentar aquí los resultados.Este error puede ser difícil de rastrear en situaciones reales. Aquí proporciono una solución para la situación del mundo real. Usaré mi script como ejemplo.
Actualicé mi script de shell. Al ejecutarlo recibí el siguiente mensaje de error:
Esta es la última línea que tiene un par de comillas dobles.
Normalmente, reviso mi script de shell cada vez que lo modifico. Esta vez, esperé un día y olvidé dónde había hecho modificaciones. El problema ocurrió en cualquier lugar antes de esta línea (1508). El problema es que incluso yo comenté la línea 1508
el verdugo de shell aún dijo que la línea 1508 tiene problemas.
Luego hice una copia del script de shell original. Eliminar un montón de código de la parte inferior. Luego validar mi código con el siguiente comando
Ahora mi archivo es 1/3 del tamaño original. Inmediatamente vi el problema:
Por algún motivo, el analizador de shell no captura el "interior {} sin igual. Aquí es donde el analizador de shell puede mejorarse aún más.
El algoritmo más rápido para encontrar el problema es eliminar la mitad de su código desde la parte inferior, si el error de sintaxis desaparece, entonces está en esta mitad. Si el error de sintaxis sigue ahí, el problema está en la mitad superior.
Si hay problemas en la mitad posterior, deshaga la eliminación. Repite este proceso. Puede reducir a un tamaño más pequeño para encontrar la fuente del problema.
Al eliminar el código, debe eliminar una sección completa del código. Por ejemplo, toda la función.
Puede usar bash -n scriptname o simplemente ejecutar directamente el script. Ambos deberían funcionar.
fuente