Script shell (bash)

bonjour tout le monde ça serait pour savoir si vous faites du script shell ici car j'ai bcp de difficulte???????????
merci
Configuration: Windows XP
Internet Explorer 6.0

22 réponses

Résumé de la discussion

Question initiale porte sur le script shell et les difficultés liées à la création d'un script qui effectue des opérations arithmétiques sur deux entiers. Plusieurs solutions émergent, incluant l'emploi d'un menu opéré par case et read, l'utilisation de bc pour les divisions réelles, et des variantes avec expr ou $((...)) pour les calculs entiers. Des échanges concernent aussi la gestion d'erreurs telle la division par zéro, l'affichage des résultats et une comparaison entre expr, let et les formes arithmétiques modernes comme $((...)) ou les variantes anciennes. En complément, certains échanges évoquent des scripts utilitaires affichant le répertoire courant ou présentant des démonstrations d'affichage des résultats lors de l'exécution.

Bobot (l’IA à votre service)
  1. Modérateur
    Re,

    1)ecrire un programme shell nommé "operation". Ce programme utilise deux arguments (on suppose que les deux arguments sont des entiers et le deuxième argument est nul). Le programme doit calculer et afficher la somme, la difference, la division, la multiplication et le reste de la division.
    #!/bin/sh
    
    n1=$1
    n2=$2
    
    echo "Entrez l'opération à effectuer :"
    read op
    
    case $op in
    '+')
       echo $(($1 + $2))
       ;;
    '-')
       echo $(($1 - $2))
       ;;
    '*')
       echo $(($1 * $2))
       ;;
    '/')
       echo "scale=2;$1/$2" | bc
       ;;
    *)
       echo "Opération inconnue"
       ;;
    esac
    
    1. #!/bin/sh
      
      while [ -z $rep ] || [ $rep != 'O' ]
      do
              echo "entrez votre signe d'opération\n+ pour une adition\n- pour une soustraction\n/ pour une division\n* pour une multiplication."
              read signe
              echo  "vous avez choisi $signe.\netes vous d'accord avec ce signe ' $signe ' ?\nO or N."
              read rep
              if [ $rep = N ]; then
                      echo "Refaite votre choix"
              elif [ $rep = O ]; then
                      echo "Entrez le premier chiffre ou nombre"
              fi
      done
      while [ -z $rep2 ] || [ $rep2 != 'O' ]
      do
              read chiffre1
              echo "$chiffre1 vous convient-il ?\nO or N."
              read rep2
              if [ $rep2 = N ]; then
                      echo "Réécriver le premier chiffre."
              elif [ $rep2 = O ]; then
                      echo "Entrez le second chiffre ou nombre."
              fi
      done
      while [ -z $rep3 ] || [ $rep3 != 'O' ]
      do
              read chiffre2
              echo "$chiffre2 vous convient-il ?\nO or N."
              read rep3
              if [ $rep3 = N ]; then
                      echo "Réécriver le second chiffre."
              elif [ $rep3 = O ]; then
                      echo "Calcul en cour."
              fi
      done
      let "a = $chiffre1"
      let "b = $chiffre2"
      
      if [ $signe = / ]; then
              let "c1 = a / b"
              echo "La solution de ce calcul est $c1"
              elif [ $signe = + ]; then
                      let "c2 = a + b"
                      echo "La solution de ce calcul est $c2"
              elif [ $signe = - ]; then
                      let "c3 = a - b"
                      echo "La solution de ce calcul est $c3"
      elif [ $signe = * ]; then
                      let "c4 = a * b"
                      echo "La solution de ce calcul est $c4"
              else
              echo " Opération non conforme."
      fi


      voila ce que j'ai fais j'ai un problème avec la multiplication et je ne vois pas d'erreurs si quelqu'un peux me donner son avis.

      merci d'avance
      1. Contributeur
        Salut,

        Une bonne habitude à prendre est de toujours quoter ses variables, surtout dans les test avec "[...]".
        En gras ce que j'ai corrigé ou ajouté.
        Le "set -xv" en début sert à débuguer le script en enlevant le dièse qui commente la ligne.

        #!/bin/sh
        
        #set -xv
        
        while [ -z $rep ] || [ $rep != 'O' ]
        do
                echo -e "entrez votre signe d'opération\n+ pour une adition\n- pour une soustraction\n/ pour une division\n* pour une multiplication."
                read signe
                echo -e "vous avez choisi $signe.\netes vous d'accord avec ce signe ' $signe ' ?\nO or N."
                read rep
                if [ $rep = N ]; then
                        echo "Refaite votre choix"
                elif [ $rep = O ]; then
                        echo "Entrez le premier chiffre ou nombre"
                fi
        done
        while [ -z $rep2 ] || [ $rep2 != 'O' ]
        do
                read chiffre1
                echo -e "$chiffre1 vous convient-il ?\nO or N."
                read rep2
                if [ $rep2 = N ]; then
                        echo "Réécriver le premier chiffre."
                elif [ $rep2 = O ]; then
                        echo "Entrez le second chiffre ou nombre."
                fi
        done
        while [ -z $rep3 ] || [ $rep3 != 'O' ]
        do
                read chiffre2
                echo -e "$chiffre2 vous convient-il ?\nO or N."
                read rep3
                if [ $rep3 = N ]; then
                        echo "Réécriver le second chiffre."
                elif [ $rep3 = O ]; then
                        echo "Calcul en cour."
                fi
        done
        let "a = $chiffre1"
        let "b = $chiffre2"
        
        if [ "$signe" = '/' ]; then
                let "c1 = a / b"
                echo "La solution de ce calcul est $c1"
                elif [ "$signe" = '+' ]; then
                        let "c2 = a + b"
                        echo "La solution de ce calcul est $c2"
                elif [ "$signe" = '-' ]; then
                        let "c3 = a - b"
                        echo "La solution de ce calcul est $c3"
        	elif [ "$signe" = '*' ]; then
                        let "c4 = a * b"
                        echo "La solution de ce calcul est $c4"
                else
                echo " Opération non conforme."
        fi
        

        Il serait bon aussi de rajouter des quotes (doubles) aux autres tests.
        J'ai rajouté aussi des "-e" à tous les "echo" qui comportent des "\n" pour que ceux-ci soient pris en compte.
      2. Modérateur
        Salut,

        La solution de zipe31 est correcte.
        Toutefois, lorsqu'on fait une opération de division je pense qu'il est souhaitable de faire un test pour la division avec zéro

        A remplacer

        if [ "$signe" = '/' ]; then 
                let "c1 = a / b" 
                echo "La solution de ce calcul est $c1"


        avec

        if [ "$signe" = '/' ]; then 
          if  [ "$b" = "0" ] 
            then 
              echo "Division avec zéro" 
              exit 
            else 
              let "c1 = a / b" 
              echo "La solution de ce calcul est $c1" 
            fi


        En revanche pour toi, je te suggère que lorsqu'il y a plusieurs imbrications de if, c'est plus pratique d'utiliser
        case $variable in 
        'cas1') 
          #..instructions 
          ;; 
        'cas2') 
          #...instructions 
          ;; 
        
        
        
          *)  
          #....instuctions 
        ;; 
        esac

        Ce qui donne
        #!/bin/sh 
        
        while [ -z $rep ] || [ $rep != 'O' ] 
        do 
                echo -e "entrez votre signe d'opération\n+ pour une adition\n- pour une soustraction\n/ pour une division\n* pour une multiplication." 
                read signe 
                echo -e "vous avez choisi $signe.\netes vous d'accord avec ce signe ' $signe ' ?\nO or N." 
                read rep 
                if [ $rep = N ]; then 
                        echo "Refaite votre choix" 
                elif [ $rep = O ]; then 
                        echo "Entrez le premier chiffre ou nombre" 
                fi 
        done 
        while [ -z $rep2 ] || [ $rep2 != 'O' ] 
        do 
                read chiffre1 
                echo -e "$chiffre1 vous convient-il ?\nO or N." 
                read rep2 
                if [ $rep2 = N ]; then 
                        echo "Réécriver le premier chiffre." 
                elif [ $rep2 = O ]; then 
                        echo "Entrez le second chiffre ou nombre." 
                fi 
        done 
        while [ -z $rep3 ] || [ $rep3 != 'O' ] 
        do 
                read chiffre2 
                echo -e "$chiffre2 vous convient-il ?\nO or N." 
                read rep3 
                if [ $rep3 = N ]; then 
                        echo "Réécriver le second chiffre." 
                elif [ $rep3 = O ]; then 
                        echo "Calcul en cours." 
                fi 
        done 
        a=$chiffre1 
        b=$chiffre2 
        case $signe in 
        '/') 
          if  [ "$b" = "0" ]  
            then 
              echo "Division avec zéro" 
              exit 
            else 
            let c1=$a/$b 
            echo "La solution de ce calcul est $c1" 
          fi 
          ;; 
        '+') 
          let c2=$a+$b 
          echo "La solution de ce calcul est $c2" 
          ;; 
        '-') 
          let c3=$a-$b 
          echo "La solution de ce calcul est $c3" 
          ;; 
        '*') 
          let c4=$a'*'$b 
          echo "La solution de ce calcul est $c4" 
          ;; 
        *) 
          echo " Opération non conforme." 
          ;; 
        esac 
        
      3. Modérateur
        Re,

        Pour aller plus loin, je crois que tu dois refaire ton algorithme

        lami20j@debian-acer:~$ ./operation.sh
        entrez votre signe d'opération
        + pour une adition
        - pour une soustraction
        / pour une division
        * pour une multiplication.
        $
        vous avez choisi $.
        etes vous d'accord avec ce signe ' $ ' ?
        O or N.
        O (ici j'ai fait l'erreur volontaire, c'est un peu embêtant de taper tout le reste pour avoir le message 'Opération non conforme' )
        Entrez le premier chiffre ou nombre
        8
        8 vous convient-il ?
        O or N.
        O 
        Entrez le second chiffre ou nombre.
        2
        2 vous convient-il ?
        O or N.
        O
        Calcul en cours.
         Opération non conforme.
        


        Volontairement j'ai testé l'opérateur $ qui n'est pas conforme et aussi j'ai choisi O (l'utilisateur peut toujours faire une erreur ;-)
        Je ne vois pas l'intérêt de continuer à demander les chiffres ou nombres puisque de toute façon l'opérateur n'est pas bon.

        Une idée sera que après la saisie de l'opérateur tu fais le test pour savoir s'il faut continuer ou pas, et ensuite offrir la possibilité d'utilisateur de changer d'opérateur ou pas.
      4. merci pour toutes ces info :) je sais ou revenir pour de l'aide merci bien :)
    2. Bonjour,

      Je voudrais savoir comment on peux utiliser les variables réels dans script?
      Par exemple mon code

      #!/bin/csh

      set x=4
      while ($x < 6)

      #echo '$i' >> data

      @ x = ($x + 1)
      end

      Je voudrais varier x [4:6] avec delta_x=0.01.

      Je vous remercie beaucoup de me répondre

      Hao
      1. Modérateur
        et avec $((....))?? Tu ne lit pas mes messages.

        là et là

        Pour $[..] dit à ton prof que c'est la forme ancienne de $((..)) donc ça ne vaut pas la peine de gaspiller des neurones et de l'encre avec ça :-))

        echo "$1 / $2 = $(echo "scale=2;$1/$2" | bc)" je fais la division en réel

        tu peux remplacer avec

        echo "$1 / $2 = $(($1/$2))"
        1. Modérateur
          et avec let
          #!/bin/sh
          
          n1=$1
          n2=$2
          
          echo -e "Opérations \n"
          echo "+ addittion"
          echo "- soustraction"
          echo "* multiplication"
          echo "/ division entière"
          echo "% modulo - calculer le reste"
          echo -e "\nEntrez l'opération à effectuer sur $1 et $2\n"
          
          read op
          
          case $op in
          '+')
             let res=$1+$2
             echo $1 + $2 = $res
             ;;
          '-')
             let res=$1-$2
             echo $1 - $2 = $res
             ;;
          '*')
             let res=$1'*'$2
             echo $1 '*' $2 = $res
             ;;
          '/')
             if  [ "$2" = "0" ] 
             then
                echo "Division avec zéro"
                exit
             else
                let res=$1/$2 
                echo $1 / $2 = $res
             fi
             ;;
          '%')
             if  [ "$2" = "0" ] 
             then
                echo "Division avec zéro"
                exit
             else
                let res=$1%$2
                echo $1 % $2 = $res
             fi
             ;;
          *)
             echo "Opération inconnue"
             ;;
          esac
          
          1. Modérateur
            et pour toutes les commandes que j'ai citer dans <12> ça marche comme ça???

            Pas tout à fait. Voilà avec declare
            #!/bin/sh
            
            declare -i res
            n1=$1
            n2=$2
            
            echo -e "Opérations \n"
            echo "+ addittion"
            echo "- soustraction"
            echo "* multiplication"
            echo "/ division entière"
            echo "% modulo - calculer le reste"
            echo -e "\nEntrez l'opération à effectuer sur $1 et $2\n"
            
            read op
            
            case $op in
            '+')
               res=$1+$2
               echo $1 + $2 = $res
               ;;
            '-')
               res=$1-$2
               echo $1 - $2 = $res
               ;;
            '*')
               res=$1'*'$2
               echo $1 '*' $2 = $res
               ;;
            '/')
               if  [ "$2" = "0" ] 
               then
                  echo "Division avec zéro"
                  exit
               else
                  res=$1/$2 
                  echo $1 / $2 = $res
               fi
               ;;
            '%')
               if  [ "$2" = "0" ] 
               then
                  echo "Division avec zéro"
                  exit
               else
                  res=$1%$2
                  echo $1 % $2 = $res
               fi
               ;;
            *)
               echo "Opération inconnue"
               ;;
            esac
            1. ah ok merci bcp
              et pour toutes les commandes que j'ai citer dans <12> ça marche comme ça???

              merci
              1. Modérateur
                Re,

                ben a vrai dire je comprend pas trop la elle sont ou les commande ?
                parce que par exemple pour le a) fallait utiliser la commande expr


                Pourtant tu as dit dans le message 12
                ok bon ça y est j'ai trouver
                pour expr c'est
                $ a=`expr 3 + 4`
                $ echo $a
                7
                #!/bin/sh
                
                n1=$1
                n2=$2
                
                echo -e "Opérations \n"
                echo "+ addittion"
                echo "- soustraction"
                echo "* multiplication"
                echo "/ division entière"
                echo "% modulo - calculer le reste"
                echo -e "\nEntrez l'opération à effectuer sur $1 et $2\n"
                
                read op
                
                case $op in
                '+')
                   expr $1 + $2
                   ;;
                '-')
                   expr $1 - $2
                   ;;
                '*')
                   expr $1 '*' $2
                   ;;
                '/')
                   if  [ "$2" = "0" ] 
                   then
                      echo "Division avec zéro"
                      exit
                   else
                      expr $1 / $2 
                   fi
                   ;;
                '%')
                   if  [ "$2" = "0" ] 
                   then
                      echo "Division avec zéro"
                      exit
                   else
                      expr $1 % $2
                   fi
                   ;;
                *)
                   echo "Opération inconnue"
                   ;;
                esac
                1. ben a vrai dire je comprend pas trop la elle sont ou les commande ?
                  parce que par exemple pour le a) fallait utiliser la commande expr
                  1. Modérateur
                    Pour exécuter
                    operation.sh N1 N2
                    N1 et N2 sont des nombres entiers

                    Ou encore
                    #!/bin/sh
                    
                    n1=$1
                    n2=$2
                    
                    echo -e "Opérations \n"
                    echo "+ addittion"
                    echo "- soustraction"
                    echo "* multiplication"
                    echo "/ division"
                    echo "% modulo - calculer le reste"
                    echo -e "\nEntrez l'opération à effectuer sur $1 et $2\n"
                    
                    read op
                    
                    case $op in
                    '+')
                       echo "$1 + $2 = $(($1 + $2))"
                       ;;
                    '-')
                       echo "$1 - $2 = $(($1 - $2))"
                       ;;
                    '*')
                       echo "$1 * $2 = $(($1 * $2))"
                       ;;
                    '/')
                       if  [ "$2" = "0" ] 
                       then
                          echo "Division avec zéro"
                          exit
                       else
                          echo "$1 / $2 = $(echo "scale=2;$1/$2" | bc)"
                       fi
                       ;;
                    '%')
                       if  [ "$2" = "0" ] 
                       then
                          echo "Division avec zéro"
                          exit
                       else
                          echo "$1 % $2 = $(($1%$2))"
                       fi
                       ;;
                    *)
                       echo "Opération inconnue"
                       ;;
                    esac
                    1. ok merci bien et sinon pour ma question <12> (le texte des commandes)
                      je pourrais avoir une tite aide aussi SVP
                      juste un exemple et apres je vous montre ce que j'ai fait
                      1. Modérateur
                        Re,

                        accepte toujours le . et la ,
                        ainsi que la notation scientifique avec E et e
                        10.23
                        10,23
                        10.23e+24
                        10.23E+24
                        10.23e-24
                        10.23E-24
                        #!/bin/sh
                        
                        echo "Entre un numéro réel : "
                        read var
                        
                        if [ "$(echo $var | grep -Eo '^[+-]?[0-9]+[.,][0-9]+([Ee]([+-]?[0-9]+))?$')" ]
                        then
                          echo  "$var est un nombre réel"
                        fi
                        1. Modérateur
                          Salut,

                          Accepte les notations avec . ou ,

                          10.23
                          10,23
                          #!/bin/sh
                          
                          echo "Entre un numéro réel : "
                          read var
                          
                          if [ "$(echo $var | grep -Eo '^[0-9]+[.,][0-9]+$')" ]
                          then
                            echo  "$var est un nombre réel"
                          fi

                          1. pk -e ça sert a koi
                            1. Modérateur
                              Salut,

                              man echo (extrait) :
                              OPTIONS
                                     -n     Ne pas effectuer le saut de ligne final.
                              
                                     -e     Interpréter les séquences de caractères précédées d'un backslash
                                            '\' suivantes :
                                            \a     alerte (sonnerie)
                                            \b     retour en arrière d'un caractère
                                            \c     supprimer le saut de ligne final
                                            \f     saut de page
                                            \n     saut de ligne
                                            \r     retour chariot
                                            \t     tabulation horizontale
                                            \v     tabulation verticale
                                            \\     backslash
                                            \nnn   le caractère de code ASCII nnn (en octal)
                              
                                     -E     Désactiver les interprétations des séquences spéciales.
                              
                              ;-))

                              PS. Évite le style SMS s'il te plaît, merci ;-)
                            2. ah ok merci (et desolé pour le style sms!!!)
                              alors tu pourrais m'expliquer les commande
                              expr, declare, let, $((...)) et $[...]

                              a quoi elle servent et comment on les utilise STP
                              Merci
                            3. @widi70Bonjour,

                              $((...)) sert a l'évaluation d'expression arithmétiques (en gros ça calcule)

                              let a=1+1 est la meme chose que a=$((1+1))

                              apres je connais $0, $1, $2 ,$n pour récupérer le n-ieme arguement
                              $# pour le nombre d'arguments
                            4. @widi70merci beaucoup et pour expr et decare tu sait?

                              mais par exemple si on me demande donner le texte du programme qui utilise la commande let ou $((...)) je doit ecrire quoi??
                              merci
                            5. @widi70ok bon ça y est j'ai trouver
                              pour expr c'est
                              $ a=`expr 3 + 4`
                              $ echo $a
                              7

                              et declare c'est:
                              Les fonctions peuvent s'exporter par la commande declare -fx fonction

                              mais maintenant ce que je comprend c'est quand on me demande de :

                              1)ecrire un programme shell nommé "operation". Ce programme utilise deux arguments (on suppose que les deux arguments sont des entiers et le deuxième argument est nul). Le programme doit calculer et afficher la somme, la difference, la division, la multiplication et le reste de la division.

                              a) Donner le texte du programme qui utilise la commande expr.
                              b)Donner le texte du programme qui utilise la commande declare.
                              c)Donner le texte du programme qui utilise la commande let.
                              d)Donner le texte du programme qui utilise la commande $((...)) ou $[...].

                              SVP donner moi juste un exemple et je ferai les autres
                              Je vous en supplie mes partiel sont lundi et il faut que j'assure
                              SVP SVP SVP SVP
                          2. Modérateur
                            Re,

                            4: Pour cette exercice il faut donnner le texte de commande:

                            nom de la commande: cmd2
                            arguments: aucun
                            effet: La commande doit editer le message suivant: "Mon repertoire courant est: ...."


                            Dans un terminal tape
                            echo -e '#!/bin/sh\n\necho "Mon répertoire courant est : $(pwd)"' > cmd2
                            ensuite pour exécution
                            chmod +x cmd2 && ./cmd2
                            1. ben voila, Je ne comprend rien et j'ai des partiels lundi (de plus j'ai ete bcp absente en cours dc je n'ai pas tout ((a cause d'un accident))).
                              donc voici quelques enonce et j'aurais besoin que vous me donniez le shell (SVP)

                              1: a) sous le repertoire courant, afficher la liste de tous les sous repertoires.
                              b) sous le repertoire courant, afficher la liste de tous les sous repertoires de chaque sous repertoire.

                              2: a)sous le repertoire courant, dupliquer les fichier ordinaire osus un repertoire dont le nom est donné en argument. Traiter tous les cas d'erreur.
                              b)Meme chose que a) mais on s'interresse à tous les fichier dont la taille ne depasse pas 50octets.
                              c)meme chose mais fichier executable.

                              3: a)Ecrire une fonction dt voici la specification:
                              nom de fct°: EntierValide
                              parametre: EstEntier
                              effet: l'entier 0 est retourné si le parametre "EstEntier" designe un entier, sinon l'entier 1 est retourné.
                              b)Ecrire une commande shell avec deux arguments. Si les deux arguments designent deux entiers alors il faut calculer et afficher les resultat des cinq operation suivant: +,-,*,/ et le reste de la division. Traiter tous les cas d'arreur.

                              4: Pour cette exercice il faut donnner le texte de commande:

                              nom de la commande: cmd2
                              arguments: aucun
                              effet: La commande doit editer le message suivant: "Mon repertoire courant est: ...."

                              Je vous remerci d'avance de vos reponse, si vous pouvez me donner qq explications à cote se serait super .

                              MERCI
                              • 1
                              • 2