Signaler

Script shell - boucle for

Posez votre question charline159 63Messages postés lundi 14 août 2017Date d'inscription 6 septembre 2017 Dernière intervention - Dernière réponse le 22 août 2017 à 17:14 par Exileur
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 !


Utile
+1
plus moins
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 63Messages postés lundi 14 août 2017Date d'inscription 6 septembre 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?
Répondre
Exileur 1127Messages 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
Répondre
Exileur 1127Messages 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
Répondre
charline159 63Messages postés lundi 14 août 2017Date d'inscription 6 septembre 2017 Dernière intervention - 22 août 2017 à 16:44
Je vais voir ça, merci pour ton aide :)
Répondre
Exileur 1127Messages 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.
Répondre
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !