Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 big_smile

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 !! big_smile

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  wink

Hors ligne