Script shell - boucle for

charline159 65 Messages postés lundi 14 août 2017Date d'inscription 28 octobre 2017 Dernière intervention - 18 août 2017 à 12:14 - Dernière réponse : Exileur 1127 Messages postés mercredi 31 août 2011Date d'inscription 14 septembre 2017 Dernière intervention
- 22 août 2017 à 17:14
Bonjour,

Mon but est de rélaliser un script où l'utilisateur indiquent des "fichier" qu'il veut renommer en "fichier-old".

#!/bin/bash

#Si il n’y aucun fichier indiqué ou si au moins un des fichiers indiqués n’existe pas, alors je (re)demande une saisie.
if [ -z $1 ] || [ ! -e $* ]
then
        read -p "Veuillez indiquer un ou des fichier(s) existant(s)." Fichier
        mv $fichier $fichier-old

#Sinon je renomme le ou les fichier(s) indiqués en paramètres.
else
        for fichier in $*
        do
                mv $fichier $fichier-old
        done
fi


Le script fonctionne mais j'ai deux soucis:

- si j'indique un fichier qui n'existe pas, alors le script me demande bel et bien une saisie. Mais si j'indique plusieurs fichiers dont au moins un qui n'existe pas, le script plante et indique "ligne 5: opérateur binaire attendu"

- à la ligne 7, l'utilisateur ne peut indiquer qu'UN seul fichier. Comment faire pour qu'elle en prenne en compte plusieurs?

Merci pour votre aide !


Afficher la suite 

11 réponses

Répondre au sujet
Exileur 1127 Messages postés mercredi 31 août 2011Date d'inscription 14 septembre 2017 Dernière intervention - Modifié par Exileur le 18/08/2017 à 13:05
+1
Utile
10
Hello,

Segmente ton code.

Contrôle la donnée (existe ? combien de fichiers ?), traite les données.

if [ ! -f tonfichier]
then
#tu redemande le fichier
fi

#ici soit le fichier est en paramétre soit l'utilisateur l'a taper. tu peux traiter ta donné.

/bin/mv $fichier $fichier_old

A plus tard sur l'tar

N'oubliez pas de marquez votre post comme résolut lorsque vous avez eu les réponses à vos questions...
Au royaume des aveugles, les borgnes sont rois.
Cette réponse vous a-t-elle aidé ?  
charline159 65 Messages postés lundi 14 août 2017Date d'inscription 28 octobre 2017 Dernière intervention - 18 août 2017 à 15:40
Eh bien j'aimerais que mon fichier soit renommé...

J'ai modifié:
#!/bin/bash

if [ -z $1 ] || [ ! -f "$*" ]
then
        while [ ! -f fichier ]
        do
                read -p "Veuillez indiquer un ou des fichier(s) existant(s)." fichier
        done

        for fichier in $*
        do
                mv $fichier $fichier-old
        done

else
        for fichier in $*
        do
                mv $fichier $fichier-old
        done
fi


Mais quand j'indique plusieurs fichiers, ça ne marche toujours pas. Je ne vois pas où est l'erreur?
Exileur 1127 Messages postés mercredi 31 août 2011Date d'inscription 14 septembre 2017 Dernière intervention - 18 août 2017 à 16:22
On controle les arguments
Un argument de fichier existe ?
non, on demande les fichiers, on controle l'entrée utilisateur.
oui, on traite les fichiers
On controle l'entré utilisateur
L'entrée utilisateur est elle vide ?
oui, on redemande, on controle l'entrée utilisateur
non, on continue, on traite les fichiers

A ce moment la, tu as ton/tes fichiers.

On traite les fichiers
Le fichier existe ?
oui, on déplace le fichier
non, on ne fait rien
Exileur 1127 Messages postés mercredi 31 août 2011Date d'inscription 14 septembre 2017 Dernière intervention - 19 août 2017 à 09:55
Si aucuns arguments n'est passés en paramètre et que l'utilisateur doit entrée les fichiers à déplacer. Doit il entrée tout les fichiers d'un coup ?

Si c'est le cas, tu devras parser l'entrée utilisateur.
Sinon :


zeus@hermod:~$ Veuillez indiquer un fichier: /var/log/apache2/hermod.xyz/access.log
zeus@hermod:~$ ------ Le fichier /var/log/apache2/hermod.xyz/access.log a été déplacé avec succes.
zeus@hermod:~$ Voulez vous déplacer un autre fichier ? [o/N] : o
zeus@hermod:~$ Veuillez indiquer un fichier: /var/log/apache2/hermod.xyz/error.log
zeus@hermod:~$ ------ Le fichier /var/log/apache2/hermod.xyz/error.log a été déplacé avec succes.
zeus@hermod:~$ Voulez vous déplacer un autre fichier ? [o/N] : o
zeus@hermod:~$ Veuillez indiquer un fichier: gqgdgagagadgdagadgdagadgag
zeus@hermod:~$ Le fichier gqgdgagagadgdagadgdagadgag n'existe pas !!!
zeus@hermod:~$ Veuillez indiquer un fichier:
^C
charline159 65 Messages postés lundi 14 août 2017Date d'inscription 28 octobre 2017 Dernière intervention - 22 août 2017 à 16:44
Je vais voir ça, merci pour ton aide :)
Exileur 1127 Messages postés mercredi 31 août 2011Date d'inscription 14 septembre 2017 Dernière intervention - 22 août 2017 à 17:14
Pour parser l'entrée utilisateur, tu peux utiliser sed || awk || cut.
Commenter la réponse de Exileur