Script shell - boucle for

charline159 Messages postés 216 Statut Membre -  
Exileur Messages postés 1621 Date d'inscription   Statut Membre Dernière intervention   -
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 !

1 réponse

  1. Exileur Messages postés 1621 Date d'inscription   Statut Membre Dernière intervention   150
     
    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
    1. charline159 Messages postés 216 Statut Membre 1
       
      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
    2. Exileur Messages postés 1621 Date d'inscription   Statut Membre Dernière intervention   150
       
              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
    3. Exileur Messages postés 1621 Date d'inscription   Statut Membre Dernière intervention   150
       
      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
    4. charline159 Messages postés 216 Statut Membre 1
       
      Oui je n'ai pas encore vu les fonctions. Je le ferrai quand j'aurais abordé cette notion :)
      0
    5. Exileur Messages postés 1621 Date d'inscription   Statut Membre Dernière intervention   150
       
      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