Script shell - Retour de fonction

Résolu
Bonjour,

Je souhaiterais qu'une fonction me retourne une chaine de caractères par exemple.

Qu'existe-t-il comme solution ?

Merci à tous.

A+
Configuration: Windows XP
Internet Explorer 6.0

10 réponses

  1. Contributeur
    Bonjour,

    #!/bin/bash 
    # 
    # Note : le #! est obligatoire pour que le variable=$(commande) 
    # soit interprete par le shell 
    # 
    ma_fonction() 
    { 
        if [ ${1} -lt ${2} ] 
        then 
               echo "estpluspetit ${1} ${2}" 
        fi 
    } 
    
    resultat=$(ma_fonction 1 2) 
    
    echo ${resultat} 
    

    Jean-Pierre Zuate
    1. Attention cependant à ne pas mettre d'autres instruction "echo" dans la fonction appelée (en guise de traces, par exemple), car sinon, l'affectation dans une variable n'est plus possible, puisqu'il y aurait plus qu'une ligne de valeur de retour.
  2. salut , en utilisant return :

    fonct() { if [ $1 -lt $2 ] ;then return 2 ;else return 3 ;fi; }

    fonct 10 9 ; echo $?
    renvoie 3

    fonct 9 10 ; echo $?
    renvoie 2

    c'est tres pratique pour gerer des erreures à l'interieur d'une fonction, seulement ,on doit utiliser la reponse de la sortie $? desuite apres
    l'appel de la fonction
    1. Attention cependant à ne pas mettre d'autres instructions "echo" dans la fonction appelée (en guise de traces, par exemple), car sinon, l'affectation dans une variable n'est plus possible, puisqu'il y aurait plus qu'une ligne de valeur de retour.

      exemple:
      ma_fonction()
      {
          echo "appel de ma_fonction() avec les parametres $1 et $2."
          if [ ${1} -lt ${2} ]
          then
                 echo "estpluspetit ${1} ${2}"
          fi
      }
      
      resultat=$(ma_fonction 1 2)
      


      Dans ce cas, l'affection dans la variable 'resultat' ne marche pas.
      1. oups excuse-moi , j'ai oublié,
        en utilisant la bonne sortie de $? , on peut donc choisir :

        fonct 10 9 ;
        if [ "$?" == 3 ] ;then .....
        else....
        fi
        ou
        fonct 9 10 ;
        if [ "$?" == 2 ]; then ....
        else...
        fi
        1. Encore un petit truc :

          est-il possible, au sein d'une même fonction, d'utiliser echo pour à la fois afficher des messgaes (d'erreurs par ex) et à la fois affecter le retour de la fonction ?

          en d'autres termes est-il possible que "ma_fonction" affiche des messages d'erreurs sur la console en
          l'appelant de cette manière ?
          resultat=$(ma_fonction 1 2)

          Merci à tous les grands chefs !

          A+
          1. Contributeur
            Oh yes. Il faut utiliser stderr (>&2) pour rediriger un echo.

            Dans cet exemple on fait un echo "erreur !!!" si l'argument 1 n'est pas plus grand que l'argument 2 et ce sont les paramètres passés au shell qui servent à évaluer le test de ma_fonction.

            Soit donc le code test2.sh :
            #!/bin/bash 
            # 
            # Note : le #! est obligatoire pour que le variable=$(commande) 
            # soit interprete par le shell 
            # 
            ma_fonction() 
            { 
                if [ ${1} -lt ${2} ] 
                then 
                       echo "estpluspetit ${1} ${2}" 
                else 
                       echo "erreur !!!" >&2 
                fi 
            } 
            
            resultat=$(ma_fonction ${1} ${2}) 
            
            echo ${resultat} 
            


            Exemples :
            * Cas normal d'utilisation : 1 est plus petit que 2, le message s'affiche
            $ ./test2.sh 1 2 
            estpluspetit 1 2 
            

            * On redirige stdout vers /dev/null : 1 est plus petit que 2, le message ne s'affiche pas (il part vers /dev/null)
            $ ./test2.sh 1 2 > /dev/null 
            

            * Mise en évidence de stderr : 11 est plus grand que 2 et on redirige stdout vers /dev/null et le message erreur !!! d'affiche dans stderr qui n'est pas redirigé
            $ ./test2.sh 11 2 > /dev/null 
            erreur !!! 
            


            Voili voilà ...
            Jean-Pierre Zuate
            1. Le grand maître a répondu : l'élève baisse les yeux, se tait et apprend.

              IMPECCABLE CA !!!!!!!!!!!! tu es LE patron

              Merci tout plein !

              A+
              1. salut jaxx,

                si c'est bien en shell que tu veux un retour de fonction voila ce que je te propose (mon exemple est nul, mais il est simple à comprendre) :

                #!/bin/bash
                #
                # fonction qui retourne "oui" si le chiffre passé en 1er argument
                # est plus petit que le chiffre passé en 2eme argument. Elle
                # retourne "non" dans le cas contraire
                #
                function esseplupetit()
                {
                if [ $1 -lt $2 ]
                then echo "oui"
                else echo "non"
                fi
                }

                echo `esseplupetit $1 $2`
                1. Merci à vous mais :

                  - return ne permet que de retourner des valeurs numériques. Je voudrais retourner une chaine de caractères

                  - je voudrais mettre le retour de fonction dans une variable : resultat=espluspetit 1 2

                  Merci pour vos réponses.

                  A+
                  1. Merci,

                    Je savais pas que echo permettait ce genre de chose.

                    vous êtes les grands chefs
                    EL GRANDE SHELL MANITOUS !!

                    Re-Merci

                    A+