Script shell - boucle for

Fermé
charline159 Messages postés 208 Date d'inscription lundi 14 août 2017 Statut Membre Dernière intervention 22 juin 2022 - Modifié le 18 août 2017 à 13:35
Exileur Messages postés 1475 Date d'inscription mercredi 31 août 2011 Statut Membre Dernière intervention 16 décembre 2022 - 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 !


A voir également:

1 réponse

Exileur Messages postés 1475 Date d'inscription mercredi 31 août 2011 Statut Membre Dernière intervention 16 décembre 2022 150
Modifié le 18 août 2017 à 13:05
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.
1
charline159 Messages postés 208 Date d'inscription lundi 14 août 2017 Statut Membre Dernière intervention 22 juin 2022 1
18 août 2017 à 14:57
Salut!
J'ai suivi ton schéma du coup, et j'ai segmenté en deux parties:

#!/bin/bash

#si l'utilisateur n'a pas indiqué de fichier(s), alors je lui en demande
if [ ! -f "$*" ]
then
        while [ ! -f "$fichier" ]
        do
                read -p "Veuillez indiquer un ou des fichier(s) existant(s)." fichier
        done
fi


#le(s) fichier(s) sont ensuite renommés
for fichier in "$*"
do
        mv $fichier $fichier-old
done

Le script ne marche que si j'indique dès le début un fichier en paramètre.
Sinon si j'indique deux fichiers, il me demande tout de même de saisir le nom d'un fichier...
0
Exileur Messages postés 1475 Date d'inscription mercredi 31 août 2011 Statut Membre Dernière intervention 16 décembre 2022 150
Modifié le 18 août 2017 à 15:02
        for fichier in $*
        do
                if [ -f $fichier] 
                then 
                         /bin/mv $fichier{,-old}
                         echo "$fichier déplacé avec succés"
                fi
                else
                        echo "Le fichier $fichier n'existe pas" 
                fi
        done
0
Exileur Messages postés 1475 Date d'inscription mercredi 31 août 2011 Statut Membre Dernière intervention 16 décembre 2022 150
18 août 2017 à 15:05
Tu as du code qui se répéte.
Fais une fonction ou change ton code pour que le mv n'y soit pas deux fois.
0
charline159 Messages postés 208 Date d'inscription lundi 14 août 2017 Statut Membre Dernière intervention 22 juin 2022 1
18 août 2017 à 15:06
Oui je n'ai pas encore vu les fonctions. Je le ferrai quand j'aurais abordé cette notion :)
0
Exileur Messages postés 1475 Date d'inscription mercredi 31 août 2011 Statut Membre Dernière intervention 16 décembre 2022 150
18 août 2017 à 15:08
while [ ! -f "$fichier" ]
do
read -p "Veuillez indiquer un ou des fichier(s) existant(s)." fichier
done

------------------------------

Si le fichier $fichier n'existe pas.
Indiquer un fichier existant.
Fin

Je suis pas sure que ça soit ce que tu veuilles ^
0