String et fonction Shell
Par Cédric Tabin le jeudi 30.10.2008, 09:00 - Général - Lien permanent
Sous linux, je me crée souvent de petits scripts shell permettant de me simplifier la vie. Il est possible également de créer des fonctions à l'intérieur de ces scripts pouvant retourner des valeurs numériques. C'est un petit peu plus compliqué pour les chaînes de caractères...
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 !
Commentaires
Très sympa en effet ! Faudra que tu en écrives d'autre la dessus, ça m' intéresse beaucoup ce genre de scripts !
Salut,
Yep d'autres viendront probablement aussi
@++