Forum Linux.débutant Exercice shell script

Posté par . Licence CC by-sa
1
4
nov.
2014

Bonsoir, demain j'ai un contrôle et j'essaye de m'entrainer à faire des scripts :

Je bloque pour ce script :

Exercice 2 : et-ou

Écrivez deux scripts et.sh et ou.sh, permettant de reproduire le comportement des opérateurs && et || à
l’aide de boucles. Les commandes à exécuter (sans argument) seront passées en paramètres du script l’une
après l’autre.

Voici mon code, comment je fait pour faire exécuter l'argument ? Quand je met simplement $i j'ai une erreur

#!/bin/sh

if [ $# -ge 1 ]
 then for i
   do $i
   done
if [ $? -ne 0 ]
 then do
 shift 1
 $i
 done
else
 echo "commande non valide"
fi
exit 1
fi
exit 0
  • # Bonne nuit !

    Posté par . Évalué à 1. Dernière modification le 04/11/14 à 19:47.

    Relis ton code et/ou cours, regarde bien ce que fais la commande shift, vérifie tes ouvertures et fermetures de boucles, etc.

    Ça, c'est pour la partie "aide".

    Sinon :

    demain j'ai un contrôle
    Exercice 2 :

    Là, on ne va pas pouvoir grand chose pour toi… si tu bloque à l'exercice 2 pour un contrôle demain, je te conseillerai plutôt de te pencher sur l'option : trouver une bonne excuse pour sécher, et te représenter au rattrapage (s'il y a) en t'y étant pris à temps pour réviser…

    • [^] # Re: Bonne nuit !

      Posté par . Évalué à 1.

      En fait j'ai réussi tout les autres exercices, c'est à celui la que je ne sais pas comment faire

      Sinon cette partie du code est-elle correcte ?

      do 
      $i
      done
      • [^] # Re: Bonne nuit !

        Posté par . Évalué à 1. Dernière modification le 04/11/14 à 20:42.

        Mettons que tous les autres exos soient corrects.

        Déjà, il faut dire quelle est l'erreur (sinon, pas facile de deviner si c'est du sh, du bash, du zsh…).

        En bash, en prenant ton script, j'ai :
        Syntax error: "do" unexpected

        Donc revoir la structure des boucles, l'indentation éventuellement, même si ça ne joue pas (trop).

        Eventuellement : poste en pseudo-code (donc met le shell de côté). On verra ce que ça donne, déjà.

        • [^] # Re: Bonne nuit !

          Posté par . Évalué à 1.

          J'ai réussi pour la correction du do :

          #!/bin/sh
          
          if [ $# -ge 1 ]
           then for i
             do $i
             done
          fi
          if [ $? -ne 0 ]
           then echo "argument non valide"
           exit 1
          else
           $i
           shift 1
          fi
          exit 0

          Par contre quand j’exécute le script :

          ./ouu.sh ps date

          J'obtiens deux fois la date à la fin alors que je ne la veux qu'une seule fois ?

           PID TTY          TIME CMD
           8635 pts/31   00:00:00 bash
          10462 pts/31   00:00:00 bash
          10463 pts/31   00:00:00 cat
          11978 pts/31   00:00:00 bash
          11979 pts/31   00:00:00 ps
          mardi 4 novembre 2014, 21:27:19 (UTC+0100)
          mardi 4 novembre 2014, 21:27:19 (UTC+0100)
          • [^] # Re: Bonne nuit !

            Posté par . Évalué à 1.

            Encore une fois, c'est tout à fait normal.

            Simplifie encore plus tes vérifications (regarde ce que vaut $i plutôt que de l'exécuter).

            Fais un code pseudo-code.

            Je ne peux pas t'aider plus sans te donner la solution :)

            • [^] # Re: Bonne nuit !

              Posté par . Évalué à 1.

              Finalement :

              #!/bin/sh
              
              if [ $# -ge 1 ]
              then $1
              else echo "usage: <cmd> <cmd>"
              exit 1
              fi
              if [ $? -ne 0 ]
              then echo "argument non valide"
              exit 1
              else
              $2
              fi
              exit 0

              ça fonctionne mais j'aurais quand même voulu savoir comment enlever la sortie d'erreur lorsque l'on entre une commande qui n'existe pas

              Je sais qu'il faut rediriger vers >&2 dev/null mais c'est quoi que je dois rediriger ?

              Exemple :

              ./ouu.sh date me

              mardi 4 novembre 2014, 21:54:24 (UTC+0100)
              ./ouu.sh: line 15: me : commande introuvable <- je veux enlever cette ligne

              • [^] # Re: Bonne nuit !

                Posté par . Évalué à 1.

                Tu es parti sur une mauvaise piste pour ce soir :)

                Ne t'acharne pas sur le shell… il est miné pour ce que tu en fais !

                C'est quand même délire, tu demande de l'aide, je t'en propose en simplifiant l'approche et te proposant de t'aider si tu fais un effort, comme mettre en pseudo-code, et tu t'obstine à rester sur des erreurs qui ne vont rien résoudre, si ce n'est t'enfoncer dans des méandres dont tu n'as rien à faire pour le moment :)

                J'en reviens donc à ma proposition initiale. Cherche une bonne excuse pour demain.

                Genre : Ton chien est mort ?
                Toi : Oui, mais il a beaucoup souffert.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.