Partage
  • Partager sur Facebook
  • Partager sur Twitter

Besoin d'aide pour l'exercice multirenommage.sh

script shell

Sujet résolu
    11 septembre 2019 à 1:24:05

    Bonsoir les gens ! 

    Je suis actuellement en train faire l'exercice suivant du cours "Reprendre le contrôle avec Linux" :

    Essayez de créer un script multirenommage.sh, reposant sur ce principe, qui va rajouter le suffixe-old… uniquement aux fichiers qui correspondent au paramètre envoyé par l'utilisateur !

    Si aucun paramètre n'est envoyé, vous demanderez à l'utilisateur de saisir le nom des fichiers à renommer avecread.

    Voici mon script : 

    #!/bin/bash
      2 
      3 if [ $1 = "txt" ] && [ -n $1 ]
      4 then
      5         read -p "Veuillez indiquer le suffixe souhaité :" ext
      6 
      7 var=`ls *.txt`
      8 
      9 for fichier in $var
     10 do
     11         mv $fichier $fichier-$ext
     12 done
     13         echo "Done !"
     14 fi
     15 
     16 if [ -z $1 ]
     17 then
     18         read -p "Indiquez les fichier que vous souaitez modifier :" stack
     19         read -p "Indiquez le suffixe à ajouter : " ext
     20         for variable in $stack
     21         do
     22                 if [ -e $variable ] && [ -f $variable ]
     23                 then
     24                         mv $variable $variable-$ext
     25 
     26                 elif [ -d $variable ]
     27                 then
     28                         echo " n'est pas un fichier"
     29                         exit 1
     30                 fi
     31         done
     32         echo "Done !"
     33 fi
    

    Mon script fonctionne parfaitement, ou presque ... Quand  mon script essaye d'exécuter la deuxième condition (dans laquelle aucun paramètre n'est envoyé), une ligne s'affiche juste avant le premier message du "read" me signalant qu'un opérateur unaire est attendu : 

    ./multi.sh 
    ./multi.sh: ligne 3 : [: = : opérateur unaire attendu
    Indiquez les fichier que vous souhaitez modifier :

    Au début j'ai pensé qu'au lancement du script, celui-ci allait d'abord vérifiait la toute première condition du "if" : 

    if [ $1 = "txt" ]

    Et que à ce moment précis le script s'attendait peut être à ce qu'il y ait un paramètre envoyé  pour le 1$. D'où l'erreur.

    Du coup j'ai ajouté une autre condition avec && pour en gros dire au script de ne vérifier la toute première condition du "if" seulement dans le cas où  la chaîne est non vide en pensant que ça allait résoudre le soucis :

    && [ -n $1 ]

    Ça n'a malheureusement rien donné. Est-ce que vous pourriez m'expliquer pourquoi j'ai cette erreur s'il vous plait ? 

    Le message d'erreur n’empêche pas l'exécution du script. 

    Je souhaiterais aussi savoir autre chose.

    Mon script ne correspond pas exactement à ce qui est demandé dans l'exercice:

    Dans l'exercice on nous demande d'écrire un script qui reçoit en paramètre *.txt et je n'ai pas su comment coder ça. J'ai essayé de faire une condition "if" du genre : 

    if [ $1 = "*.txt"]
    then
       etc
    
    

    et ce pour recevoir le paramètre indiqué dans l'énoncé mais ça n'a pas fonctionné. Du coup j'ai été contraint de modifier un peu mon script. Mais je suis vraiment intrigué de savoir comment faire pour que le script reçoive en paramètre "*.txt".

    Est-ce quelqu'un pourrait m'expliquer ? Ça serait vraiment cool et ça m'aiderait beaucoup pour la suite.





    • Partager sur Facebook
    • Partager sur Twitter

    Your future self is watching you right now through memories ! 

      11 septembre 2019 à 1:28:31

      salut,

      il faut toujours mettre les Développements de paramètres entre guillemets.
      TOUJOURS!
      à moins de savoir pourquoi. ;)

      et

      on n'utilise pas ls dans un script

      surtout pour mettre le résultat dans une variable plate !

      on boucle avec for directement sur le Développement des chemins.

      -
      Edité par dantonq 11 septembre 2019 à 1:30:24

      • Partager sur Facebook
      • Partager sur Twitter

      Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

        11 septembre 2019 à 1:58:46

        dantonq a écrit:

        salut,

        il faut toujours mettre les Développements de paramètres entre guillemets.
        TOUJOURS!
        à moins de savoir pourquoi. ;)

        et

        on n'utilise pas ls dans un script

        surtout pour mettre le résultat dans une variable plate !

        on boucle avec for directement sur le Développement des chemins.

        -
        Edité par dantonq il y a 26 minutes


        Merci d'avoir pris le temps de répondre à mon sujet.

        Que veux-tu dire par développement de paramètres  ? 

        • Partager sur Facebook
        • Partager sur Twitter

        Your future self is watching you right now through memories ! 

          11 septembre 2019 à 2:19:13

          Bonjour @AzimBeledjhem,

          Tu peux "faire exploser" ta variable "var" si le nombre de fichiers est trop important.

          Il vaut mieux faire une boucle :

          for file in *.txt; do
           action...
          done

          Pour le if... "[" est l'équivalent de la commande test. Il vaut mieux utiliser la syntaxe "if [ condition1 -a condition2 ]; then"... (Cf. man test).

          if [ $1 = "txt" -a -n $1 ]; then
           action...
          fi

          Je ne dis pas que les tests sont bons mais cela te permettra d'avancer.
          Bien à toi.

          -
          Edité par BugHunt3r 11 septembre 2019 à 2:21:22

          • Partager sur Facebook
          • Partager sur Twitter

          Pensez a mettre +1 aux messages qui vous ont aidé et mettre résolu quand cela l'est.

            11 septembre 2019 à 3:43:39

            et les guillemets ?! $1 peut contenir plusieurs mots :

            $ maFonc() { echo "$1";}
            $ maFonc "premier paramètre" "deuxième paramètre"
            premier paramètre

            dans un test, sans guillemets, premier paramètre ne passera pas.

            pour ma part, je préconise l'emploi de test, qui a l'avantage de mettre en évidence la structure de if :

            if <commande>; then ...; fi

            les débutants ont tendance à croire que les crochets font parties de la structure de if. :(

            les expressions en italique, dans mon premier message, sont des paragraphes du man bash

            -
            Edité par dantonq 11 septembre 2019 à 3:46:07

            • Partager sur Facebook
            • Partager sur Twitter

            Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

              11 septembre 2019 à 5:06:16

              dantonq a écrit:

              pour ma part, je préconise l'emploi de test, qui a l'avantage de mettre en évidence la structure de if:

              if <commande>; then ...; fi

              -
              Edité par dantonq il y a environ 1 heure

              Penses-tu que "if <commande>; then ..." à la place de "if <condition>; then ..." soit un bon exemple à donner ?

              Je ne suis pas là pour donner les solutions mais pour indiquer le chemin, il n'y a que par la pratique que l'on progresse.

              Continue @AzimBeledjhem et ne te décourage pas :)

              • Partager sur Facebook
              • Partager sur Twitter

              Pensez a mettre +1 aux messages qui vous ont aidé et mettre résolu quand cela l'est.

                11 septembre 2019 à 5:29:31

                bien sûr que c'est le bon exemple à donner.

                d'ailleurs :

                $ help if
                if: if COMMANDES; then COMMANDES; [ elif COMMANDES; then COMMANDES; ]... [ else COMMANDES; ] fi
                [...]

                test évalue une condition (égal, différent, plus grand, plus petit...)
                if évalue le code de retour d'une commande (0, ou >=1)

                • Partager sur Facebook
                • Partager sur Twitter

                Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

                  11 septembre 2019 à 12:15:54

                  Bonjour à toi @dantonq,

                  Extrait de la documentation "bash" :

                         if list; then list; [ elif list; then list; ] ... [ else list; ] fi
                                The if list is executed.  If its exit status is zero, the then list is executed.  Otherwise,
                                each elif list is  executed  in turn, and if its exit status is zero, the corresponding then
                                list is executed and the command completes.  Otherwise, the else list is executed, if
                                present.  The exit status is the exit  status  of the last command executed, or zero if
                                no condition tested true.

                  Dans ce contexte, le 
                  if list

                  Est un branchement conditionnel ou l'équivalent de "if condition(s)" qui est générique (une suite des test(s)), non restreint à une commande. Même si les apprenants ne comprennent pas que "[" est l'équivalent de la commande test.

                  Il est conseillé de tester les codes d'erreur de toutes les commandes, la documentation bash ne parle pas de commandes : s'il y en a une, elle devrait être précédée d'un "test". Cela fait partie des "Best Practices".

                  L'utilisation d'une commande avec un "if" n'est pas facilement compréhensible par des débutants et ce n'est pas l'objet de sa question.

                  Je ne veux pas rentrer dans ce débat et je me focalise sur le problème de l'élève.
                  Excellente journée à toi.

                  -
                  Edité par BugHunt3r 11 septembre 2019 à 13:31:48

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Pensez a mettre +1 aux messages qui vous ont aidé et mettre résolu quand cela l'est.

                    11 septembre 2019 à 15:51:57

                    list doit être entendu comme une liste de commandes (cf. man bash /Lists)
                    les débutants ne peuvent pas comprendre ce qu'on ne leur explique pas.
                    et les enseignants doivent se souvenir qu'ils sont aussi des apprenants, tout le temps; qu'ils n'ont pas acquis, une fois pour toutes, un savoir perpétuel.

                    -
                    Edité par dantonq 11 septembre 2019 à 15:52:15

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

                      11 septembre 2019 à 18:10:39

                      @dantonq @BugHunt3r

                      Merci beaucoup d'avoir pris le temps de répondre à mon sujet.

                      En vous souhaitant une bonne soirée.

                      Cordialement.

                      Azim

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Your future self is watching you right now through memories ! 

                      Besoin d'aide pour l'exercice multirenommage.sh

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown