Je viens d'écrire un script bash et j'obtiens toujours cette erreur EOF.
Voici donc mon script (ne fonctionne que sur 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
Et voici mon erreur:
./coding.sh: line 144: unexpected EOF while looking for matching `"'
./coding.sh: line 147: syntax error: unexpected end of file
Vous pouvez voir votre problème si vous regardez simplement votre question. Notez comment la coloration syntaxique est foirée après la ligne 95:
echo -e "Sorry, an error occurred. You have to run this on OS X""
Comme le message d'erreur vous l'indique, vous disposez d'un "
Inégalé. Supprimez simplement "
Supplémentaire de la ligne ci-dessus et tout devrait bien se passer:
echo -e "Sorry, an error occurred. You have to run this on OS X"
Cette erreur peut être difficile à suivre dans des situations réelles. Ici, je propose une solution pour des situations réelles. Je vais utiliser mon script comme exemple.
J'ai mis à jour mon script Shell. Lors de son exécution, j'ai reçu le message d'erreur suivant:
/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
Il s'agit de la dernière ligne contenant une paire de guillemets doubles.
Normalement, je vérifie mon script Shell chaque fois que je le modifie. Cette fois, j'ai attendu un jour et j'ai oublié où j'avais fait une modification. Le problème s'est produit n'importe où avant cette ligne (1508). Le problème est que même j'ai commenté le plan 1508
#Elif [ "$project" ]; then
le bourreau de Shell a quand même dit que la ligne 1508 avait des problèmes.
Ensuite, j'ai fait une copie du script Shell d'origine. Suppression d'un tas de code en bas. Validez ensuite mon code avec la commande suivante
bash -n mysbashscript
mybashscript: line 515: unexpected EOF while looking for matching `"'
mybashscript: line 561: syntax error: unexpected end of file
Maintenant, mon fichier est 1/3 de la taille d'origine. J'ai tout de suite vu le problème:
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
Pour une raison quelconque, le "
Inégalé à l'intérieur de {}
N'est pas capturé par l'analyseur Shell. C'est là que l'analyseur Shell peut être encore amélioré.
L'algorithme le plus rapide pour trouver le problème est de supprimer la moitié de votre code par le bas, si l'erreur de syntaxe disparaît, c'est dans cette moitié. Si l'erreur de syntaxe est toujours là, le problème dans la moitié supérieure.
Si le problème dans la seconde moitié, annulez la suppression. Répétez ce processus. Vous pouvez réduire votre taille pour trouver la source du problème.
Lors de la suppression de code, vous devez supprimer une section entière de code. Par exemple, toute la fonction.
Vous pouvez soit utiliser bash -n script_name
Soit simplement exécuter directement le script. Les deux devraient fonctionner. (ici script_name est juste fooscript ou barscript à des fins d'illustration pas un vrai nom de script et devrait être un mot).