Forum Programmation.shell [RESOLU] interprétation de *

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
-1
28
mar.
2013

Bonjour à toutes et à tous

voici mon script tout bête

function calcul
{
        if [ $2 = '*' ]
        then
                let "resultat=$1 $2 $3"
                echo "Le résultat est : $resultat"
        else
                let "resultat=$1 $2 $3"
                echo "Le résultat est : $resultat"
        fi

}

calcul $1 $2 $3

mon souci concerne l'astérisque. L'opération

./mon_programme 2 * 2 retourne l'erreur suivante
./mon_programme: line 8: let: resultat=2 appdata.xml AUTRE: syntax error: invalid arithmetic operator (error token is ".xml AUTRE")
Le résultat est :

auriez vous une explication ?

hubhub

  • # escape

    Posté par  . Évalué à 1.

    ./mon_programme 2 \* 2

    • [^] # Re: escape

      Posté par  . Évalué à 1.

      avec ./mon_programme 2 \* 2 j'obtiens la même erreur.

  • # problème argument

    Posté par  . Évalué à 1.

    Je suis pas actuellement sous linux, mais en attendant, essaie ./mon_programme 2 '*' 2.
    Sinon, tu as la solution ./mon_programme 2 x 2


    then
    let "resultat = $1 * $3"
    else

    aussi, je ne connais pas ton programme mais ici, je ne vois pas la différence entre les deux opération dans le then et dans le else.

    Comme tu me le présente, j'aurais plutôt utilisé case, mais je ne connais pas le programme

    • [^] # Re: problème argument

      Posté par  . Évalué à 0. Dernière modification le 28 mars 2013 à 15:58.

      les deux solutions me renvoient le même type d'erreur.
      J'ai essayé case

      function calcul
      {
      case  $2 in
              '*')
              let "resultat=$1 * $3"
              echo "Le résultat est : $resultat"
              ;;
              *)
              let "resultat=$1 $2 $3"   <-------------- ligne 9
              echo "Le résultat est : $resultat"
              ;;
      esac
      }
      
      calcul $1 $2 $3
      
      

      et comme avec if, j'ai le même type d'erreur qui fait référence à la ligne 9.

  • # Et comme ça :

    Posté par  . Évalué à 2.

    #!/bin/bash
    
    resultat=$(echo "$*" | bc  )
    
    echo "Resultat: $resultat"
    
    
  • # set -f

    Posté par  . Évalué à 2. Dernière modification le 28 mars 2013 à 13:25.

    Salut,

    Rajoutes "set -f" à ton script.

    ;-)

    • [^] # Re: set -f

      Posté par  . Évalué à -1.

      désolé mais là je ne comprends pas.
      La commande set sert à positionner des paramètres et l'option -f concerne un fileName non?
      Je ne saisis pas…

      • [^] # Re: set -f

        Posté par  . Évalué à 1.

        Le script :

        $ cat foo.sh 
        #! /bin/bash
        set -f
        function calcul
        {
        if [ $2 = '*' ]
        then
        let resultat="$1 $2 $3"
        echo "Le résultat est : $resultat"
        else
        let resultat="$1 $2 $3"
        echo "Le résultat est : $resultat"
        fi
        
        }
        
        calcul $1 $2 $3
        
        

        Exécution :

        $ ./foo.sh 2 \* 2
        Le résultat est : 4
        
        $ ./foo.sh 2 \* 8
        Le résultat est : 16
        
        $ ./foo.sh 5 \* 8
        Le résultat est : 40
        
        $ ./foo.sh 5 + 8
        Le résultat est : 13
        
        $
        
        
        • [^] # Re: set -f

          Posté par  . Évalué à 0.

          donc le fait de mettre set -f dans le script ne nous permet pas d'écrire
          ./calculette 2 * 3
          par contre, si on écrit set -f en ligne de commande puis si on lance le script, alors
          ./calculette 2 * 3
          Le résultat est 6

          Comment insérer set -f dans le script pour faire
          ./calculette 2 * 3
          Le résultat est 6

          ??

          • [^] # Re: set -f

            Posté par  . Évalué à 3.

            On ne peut pas le faire dans le script : c'est dans le shell courant que l'interprétation est faite.

            En gros lorsque tu appelles ton script, ta ligne de commande est évaluée et le "*" est interprété comme "contenu de répertoire courant" avant que le sous-shell de ton script ne soit exécuté, ce qui fait que le script appelé reçoit non pas la valeur "*", mais la valeur interprétée de "*".

            • [^] # Re: set -f

              Posté par  . Évalué à 0.

              ok merci beaucoup pour ton aide!

  • # Et comme ça (bis) ?

    Posté par  . Évalué à 2. Dernière modification le 28 mars 2013 à 14:33.

    #!/bin/bash
    
    function calcul
    {
    if [ $2 = '*' ]
    then
    let resultat="$1 $2 $3"
    echo "Le réltat est : $resultat"
    else
    let resultat="$1 $2 $3"
    echo "Le resultat est : $resultat"
    fi
    
    }
    
    calcul "$1" "$2" "$3"
    
    > mon souci concerne l'astérisque. L'opération
    
    

    ./mon_programme 2 * 2 retourne l'erreur suivante

    ./mon_programme: line 8: let: resultat=2 appdata.xml AUTRE: syntax error: invalid arithmetic operator (error token is ".xml AUTRE")

    C'est pacrce que "*" est interprété avant l'appel de ton programme comme étant le contenu du répertoire courant.

    Comme ça a été dit plus haut, il faut protéger le caractère "*" pour qu'il ne soit pas interprété avec un \

    Ca donne ça :

    # ls .
    calcul
    
    # ./calcul 2 * 3
    ./calcul: line 10: let: resultat=2 calcul 3: syntax error in expression (error token is "calcul 3")
    Le réltat est : 2
    
    # ./calcul 2 \* 3
    Le réltat est : 6
    
    

    Ensuite avec let, tu as mal placé tes quotes, et c'est pour ça que ça ne fonctionne pas.

  • # Solution

    Posté par  (site web personnel) . Évalué à 3.

    function calcul
    {
    if [ "$2" = "*" ]
    then
    let "resultat=$1 $2 $3"
    echo "Le résultat est : $resultat"
    else
    let "resultat=$1 $2 $3"
    echo "Le résultat est : $resultat"
    fi
    
    }
    
    calcul "$1" "$2" "$3"
    
    

    [gnumdk@arch ~]$ ./plop 3 '*' 3
    Le résultat est : 9

    • [^] # Re: Solution

      Posté par  . Évalué à 2. Dernière modification le 28 mars 2013 à 14:42.

      Chez moi avec * ça marche. J'ai eu un autre problème et j'ai cru que les quotes du let étaient mal placées mais aparamment ça ne pose pas problème.

      • [^] # Re: Solution

        Posté par  . Évalué à 2. Dernière modification le 28 mars 2013 à 14:45.

        Je crois que le problème du posteur initial vient de l'appel de la fonction avec les arguments sans les quotes.

        calcul $1 $2 $3

    • [^] # Re: Solution

      Posté par  . Évalué à 1.

      merci, c'est parfait et pas besoin de '*' un simple * suffit
      ./calculette 3 * 3
      Le résultat est : 9

      • [^] # Re: Solution

        Posté par  . Évalué à 1.

        Comment fait on pour mettre résolu sur la discussion ?

        • [^] # Re: Solution

          Posté par  . Évalué à 2.

          Tu dois pouvoir modifier ton post initial et insérer [résolu] au début :)

      • [^] # Re: Solution

        Posté par  (site web personnel) . Évalué à 2.

        merci, c'est parfait et pas besoin de '*' un simple * suffit

        Non, cela fonctionne parce que tu as fait un set -f mais par défaut le * est interprété par le shell.

        • [^] # Re: Solution

          Posté par  . Évalué à 0.

          oui je venais de le constater.
          Cette commande set -f , je n'arrive pas à la comprendre. J'ai essayé de l'insérer dans mon script mais sans succès.

          set -f

          function calcul
          {
          if [ "$2" = "*" ]
          then
          let "resultat=$1 $2 $3"
          echo "Le résultat est : $resultat"
          else
          let "resultat=$1 $2 $3"
          echo "Le résultat est : $resultat"
          fi
          }

          calcul "$1" "$2" "$3"

          où et pourquoi ?

Suivre le flux des commentaires

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