#1 Le 22/06/2008, à 10:41
- draco31.fr
[résolu][bash] Erreur lors de l'execution d'un script : EOF inattendu
Bonjour à tous,
Je débute en programmation bash, et je ne m'en sortais pas trop mal jusqu'à aujourd'hui.
J'ai commencé un script pour réaliser différents controls sur un fichier dont le chemin est passé en argument.
Lorsque j'execute mon script, j'obtiens l'erreur suivante :
./scp-add: line 224: EOF inattendu lors de la recherche de la concordance à `"'
./scp-add: line 228: erreur de syntaxe : fin de fichier inattendue
La ligne 224 se situe dans un "if", j'ai donc essayé de commenter le paragraphe "if ... fi" mais j'obtiens toujours la même erreur !! (même numéro de ligne ...)
Pourtant un 'cat' sur mon script en console montre bien que le paragraphe a été mis en commentaire !
Mes questions sont donc :
1. Comment être sûr que le shell repart bien du fichier script modifié, est-ce qu'il ne garde pas une version en mémoire ?
2. Que signifient les erreurs ci-dessus :
2a. J'ai mis toutes mes variables entre guillemets, mais j'ai l'impression qu'il en trouve un "tout seul".
2b. Mon script ne fait que 227 lignes : à quoi correspond l'erreur sur la ligne 228 ???
Merci d'avance pour votre aide !!! (j'en ai grand besoin !)
PS : Voici le script complet ... mais je sais pas si ça vous aidera sorti de son contexte :
#!/bin/bash
## Script pour créer autant de liste à copier que de source dans un fichier .list
## argument n°1 : nom du fichier .list à traiter en priorité
#_____________________________________________________________________________________________
#
# Positionnement dans le process général :
#
# 0. Lancement du script 'scp-action'
# 1. Contrôl du fichier queue.list constitué
# 2a. Déplacement dans ~/.scp/scp.error/ si problème
# 2b. Déplacement dans ~/.scp/scp.queue/ si OK (syntaxe)
#-> 3. Lancement du script 'scp-add' - paramètres = fichier dans scp.queue
#-> 4. Déplacement du fichier dans ~/.scp/scp.current/
#-> 5a. Déplacement dans ~/.scp/scp.error/ si problème
#-> 5b. Déplacement dans ~/.scp/scp.working/ si OK (droit d'accès, device ...)
#-> 6. Lancement du script 'scp-launch' (en fin de boucle)
#~> X. Lancement de scp-validate : Correction des queue.list en erreurs dans ~/.scp/scp.error
#______________________________________________________________________________________________
#
function ScpAdd_ShowHelp
{
echo -e "\nUtilisation :\tscp-add [fichier]\n" >&2
echo -e "\t[fichier] est optionnel," >&2
echo -e "\t\tSi fourni il doit être au format de queue.list standard" >&2
echo -e "\t\til doit comporter au moins une ligne '[ACTION]-SOURCE=(fichier_source)'" >&2
echo -e "\t\til doit comporter une seule ligne 'DESTINATION=(dossier_cible)'" >&2
echo -e "\t\t[ACTION] doit être soit 'COPY' soit 'MOVE'" >&2
echo -e "\t\t(fichier_source) et (dossier_cible) doivent être des chemins absolus" >&2
echo -e "\t\t(fichier_source) doit être accessible en lecture, et en execution si c'est un dossier" >&2
echo -e "\t\t(dossier_cible) doit être un dossier accessible en écriture, et en execution" >&2
echo -e "\tsi présent [fichier] est traité en priorité" >&2
echo -e "\tensuite tout les fichiers queue*.list du dossier '$HOME/.scp/scp.queue/' seront traités" >&2
return 0
}
##
## Main Script
##
if [[ "$#" > 1 ]]
then
echo "(EE) SCP_ADD : Trop de paramètre !" >&2
ScpAdd_ShowHelp
exit 1
else
# possibité de ne pas avoir d'argument
# ==> ajout de tout les .list en attente dans "scp.working"
declare FICHIER_LIST="$1"
echo "(II) Lancement du script avec FICHIER_LIST='$FICHIER_LIST'"
# echo "Chemin courant = $(pwd)"
fi
# Traiter d'abord le fichier passé en paramètre
if [ -n "$FICHIER_LIST" ]
then
echo "(II) $FICHIER_LIST passé en paramètre"
# Si fichier : de taille nulle ; inaccessible en lecture ; n'est pas un fichier ...
if [ ! -s "$FICHIER_LIST" ] || [ ! -r "$FICHIER_LIST" ] || [ ! -f "$FICHIER_LIST" ]
then
echo "(EE) SCP_ADD : Fichier '$FICHIER_LIST' inexistant, illisible ou vide !" >&2
ScpAdd_ShowHelp
exit 1
fi
### Déplacer le fichier queue.list dans scp.current pour pas traiter 2 fois
## Cas où 2 scp-add lancés en même temps !
declare -i nb=`ls $HOME/.scp/scp.current/queue*.list 2>/dev/null | grep -o -e '[0-9]\+' | sort -nr | head --lines=1 -`
# echo "max_in_current nb=$nb" >&2
# pré incrémentation de nb pour ne pas écraser le dernier fichier
mv "$FICHIER_LIST" "$HOME/.scp/scp.current/queue$((++nb)).list"
FICHIER_LIST="$HOME/.scp/scp.current/queue${nb}.list"
echo "Fichier .list déplacé ici $FICHIER_LIST"
# echo "in_current now nb=$nb" >&2
#------- Vérification de la destination dans le fichier .list :
# 1. pas plus d'une source
# 2. destination non nulle (absente)
# 3. destination accessible en lecture (r) + navigation (x)
# 4. emplacement physique de la destination (device) : NB attention avec les liens
declare OLD_IFS=$IFS
declare IFS='\n'
declare DESTINATION_LINE=`grep -e '^DESTINATION=' < "$ARG1"`
# Vérifier qu'il n'y a pas plusieurs destinations !
if [[ $(echo $DESTINATION_LINE | wc -l) -gt 1 ]]
then
nb=`ls $HOME/.scp/scp.error/queue*.list 2>/dev/null | grep -o -e '[0-9]\+' | sort -nr | head --lines=1 -`
mv "$FICHIER_LIST" "$HOME/.scp/scp.error/queue$((++nb)).list"
echo "(EE) SCP_ADD : Plusieurs destinations dans le fichier '$HOME/.scp/scp.error/queue${nb}.list'" >&2
$HOME/.scp/scp.script/scp-validate "$HOME/.scp/scp.error/queue${nb}.list" &
exit 1
fi
# Ne garder que le nom du dossier sans le 'DESTINATION='
declare DESTINATION="${DESTINATION_LINE:12}"
# Verifier qu'il n'y a qu'une seule destination !
if [ -n "$DESTINATION" ]
then
# Copier le fichier dans le dossier à corriger
nb=`ls $HOME/.scp/scp.error/queue*.list 2>/dev/null | grep -o -e '[0-9]\+' | sort -nr | head --lines=1 -`
mv "$FICHIER_LIST" "$HOME/.scp/scp.error/queue$((++nb)).list"
echo "(EE) SCP_ADD : Destination absente du fichier '$HOME/.scp/scp.error/queue${nb}.list'" >&2
$HOME/.scp/scp.script/scp-validate "$HOME/.scp/scp.error/queue${nb}.list" &
exit 1
## A TESTER !!!
else
if [ ! -d "$DESTINATION" ] || [ ! -x "$DESTINATION" ] || [ ! -w "$DESTINATION" ]
then
echo "(EE) SCP_ADD : La destination '$DESTINATION' n'est pas un répertoire accessible" >&2
# Copier le fichier dans le dossier à corriger
nb=`ls $HOME/.scp/scp.error/queue*.list 2>/dev/null | grep -o -e '[0-9]\+' | sort -nr | head --lines=1 -`
mv "$FICHIER_LIST" "$HOME/.scp/scp.error/queue$((++nb)).list"
$HOME/.scp/scp.script/scp-validate "$HOME/.scp/scp.error/queue${nb}.list" &
exit 1
fi
fi
IFS=$OLD_IFS
# Trouver l'emplacement physique du dossier de destination
declare DEV_TARGET=$(df $DESTINATION | tail --lines=1 - | cut -d ' ' -f 1 -)
#------- Alimentation des différents fichier .list avec
# 1 action + source
# 1 dev-source
# 1 destination
# 1 dev-target
IFS='\n'
# Ne selectionnner que les lignes qui commencent pas 'MOVE-SOURCE=' et 'COPY-SOURCE='
for SOURCE_LINE in "$(grep -e '^.\{4\}-SOURCE=' < "$FICHIER_LIST")"
do
# Ne garder que le nom du fichier/dossier sans le 'xxxx-SOURCE='
SOURCE="${SOURCE_LINE:11)"
# désassigner DEV_SOURCE pour ne pas conserver la valeur précédente
DEV_SOURCE=''
# On doit pouvoir avoir les authorisation suivante sur la source :
# - si SOURCE est un fichier : Lire
# - si SOURCE est un dossier : Lire et executer (parcourir)
if [ -d "$SOURCE" ]
then
if ( [ -r "$SOURCE" ] && [ -x "$SOURCE" ] )
then
echo "(II) SCP_ADD : '$SOURCE' est un dossier accessible en lecture/execution"
else
echo "(EE) SCP_ADD : Le dossier '$SOURCE' est inaccessible !" >&2
# créer un .list en erreur ou déplacer tout le .list ?
declare -i nb++=$(ls $HOME/.scp/scp.error/queue*.list 2>/dev/null | grep -o -e '[0-9]\+' | sort -nr | head --lines=1 -)
echo "$SOURCE_LINE" >> $HOME/.scp/scp.error/queue${nb}.list
echo "DESTINATION_LINE" >> $HOME/.scp/scp.error/queue${nb}.list
$HOME/.scp/scp.script/scp-validate "$HOME/.scp/scp.error/queue${nb}.list" &
## On passe au suivant ?
break 1
fi
else
if [ -f "$SOURCE" ]
then
if [ -r "$SOURCE" ]
then
echo "(II) SCP_ADD : '$SOURCE' est un fichier accessible"
else
echo "(EE) SCP_ADD : Le fichier '$SOURCE' est inaccessible !" >&2
# créer un .list en erreur ou déplacer tout le .list ?
declare -i nb++=$(ls $HOME/.scp/scp.error/queue*.list 2>/dev/null | grep -o -e '[0-9]\+' | sort -nr | head --lines=1 -)
echo "$SOURCE_LINE" >> $HOME/.scp/scp.error/queue${nb}.list
echo "DESTINATION_LINE" >> $HOME/.scp/scp.error/queue${nb}.list
$HOME/.scp/scp.script/scp-validate "$HOME/.scp/scp.error/queue${nb}.list" &
## On passe au suivant ?
break 1
fi
else
## Cas des liens ?
echo "(EE) SCP_ADD : La source '$SOURCE' est de type inconnu !" >&2
# cf ci-dessus
declare -i nb++=$(ls $HOME/.scp/scp.error/queue*.list 2>/dev/null | grep -o -e '[0-9]\+' | sort -nr | head --lines=1 -)
echo "$SOURCE_LINE" >> $HOME/.scp/scp.error/queue${nb}.list
echo "DESTINATION_LINE" >> $HOME/.scp/scp.error/queue${nb}.list
$HOME/.scp/scp.script/scp-validate "$HOME/.scp/scp.error/queue${nb}.list" &
break 1
fi
fi
# Créer un .list avec la source et la destination précédente
DEV_SOURCE=$(df $SOURCE | tail --lines=1 - | cut -d ' ' -f 1 -)
declare -i nb++=$(ls $HOME/.scp/scp.working/queue*.list 2>/dev/null | grep -o -e '[0-9]\+' | sort -nr | head --lines=1 -)
echo "$SOURCE_LINE" >> $HOME/.scp/scp.working/queue${nb}.list
echo "DEV-SOURCE='$DEV_SOURCE'" >> $HOME/.scp/scp.working/queue${nb}.list
echo "$DESTINATION_LINE" >> $HOME/.scp/scp.working/queue${nb}.list
echo "DEV-TARGET='$DEV_TARGET'" >> $HOME/.scp/scp.working/queue${nb}.list
done
# Supprimmer le fichier traité de .scp/scp.current
rm "$FICHIER_LIST"
### A FAIRE ###
# Lancer scp-launch avec le 1er fichier de scp.working
fi
echo "(II) hors du traitement principal !"
# Désassigner la variable FICHIER_LIST et nb pour éviter les confusions
declare -i nb=''
FICHIER_LIST=''
# Traiter le 1er fichier queue*.list suivant
nb="$(ls $HOME/.scp/scp.queue/queue*.list 2>/dev/null | grep -o -e '[0-9]\+' | sort -n | head --lines=1 -)"
FICHIER_LIST="$HOME/.scp/scp.queue/queue${nb}.list"
echo "nb trouvé = $nb"
echo "FICHIER_LIST construit = $FICHIER_LIST"
#if [ -n "$FICHIER_LIST" ]
#then
# echo "\$FICHIER_LIST=$FICHIER_LIST"
# exec bash $HOME/.scp/scp.script/scp-add "$FICHIER_LIST"
#fi
exit 0
Dernière modification par draco31.fr (Le 22/06/2008, à 14:27)
Hors ligne
#2 Le 22/06/2008, à 13:29
- xyor
Re : [résolu][bash] Erreur lors de l'execution d'un script : EOF inattendu
ligne 138:
SOURCE="${SOURCE_LINE:11)"
la petite accolade fermante qui fait perdre des heures
Hors ligne
#3 Le 22/06/2008, à 14:26
- draco31.fr
Re : [résolu][bash] Erreur lors de l'execution d'un script : EOF inattendu
Merci, merci, merci !!
Tu as trouvé la coquille uniquement en relisant ou tu utilise un éditeur spécial ?
Je me pose la question, parce que sous gedit la coloration syntaxique ne contrôle à priori pas l'appariment des parenthèses ou accolades.
En tout tu m'as sauvé la fin de mon week-end, tellement cette erreur commençait à m'obséder !!!
Hors ligne
#4 Le 23/06/2008, à 08:02
- xyor
Re : [résolu][bash] Erreur lors de l'execution d'un script : EOF inattendu
vi avec coloration syntaxique
Hors ligne