A la base, une fonction dans un script shell est faite pour se comporter comme un programme indépendant, recevant des paramètres et renvoyant une valeur numérique (généralement 0 si tout s'est bien passé ou sinon un code d'erreur). La fonction ci-dessous renverra 1 si le nombre de paramètres est incorrect (il doit en y avoir exactement 1) sinon 0.

#!/bin/sh
 
test_function()
{
    if [ "$#" -ne 1 ]; then
       return 1
    else
       return 0
    fi
}
 
test_function $1
echo "Résultat : $?"

Maintenant comment faire une fonction qui permet de renvoyer une chaine de caractère ? Et bien ce n'est tout simplement pas permis ! Le code suivant générera une erreur :

#!/bin/sh
 
test_function()
{
    if [ "$#" -ne 1 ]; then
       return "Erreur"      
    else
       return "Vous avez ecrit : $1"
    fi
}
 
test_function $1
echo "Résultat : $?"
./demo.sh: line 8: return: Vous avez ecrit : test: numeric argument required

La solution pour contourner ce genre de problème est de passer par la fonction echo et d'enregistrer le résultat dans une variable :

#!/bin/sh
 
test_function()
{
    if [ "$#" -ne 1 ]; then
       return 1      
    else
       #On ecrit sur la sortie standarde (&1)
       echo "Vous avez écrit : '$1' !" >&1
       return 0                     
    fi
}
 
# On doit mettre tout l'appel de la fonction dans des backquote !
echoed=`test_function $1`
 
if [ $? -eq 0 ]; then
    echo "Valeur : $echoed"
else
    echo "Nombre d'argument incorrect (1 requis)"
fi
> ./demo.sh test
Valeur : Vous avez écrit : 'test' !

Il est intéressant de constater que si l'echo est envoyé sur la sortie d'erreur standarde, alors cette valeur ne sera pas 'retournée' mais affichée telle quelle dans la console !