Retourner une variable

Résolu/Fermé
fabinou - 2 mai 2013 à 19:38
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 3 mai 2013 à 07:37
Bonjour,

Je possède un script bash qui stock dans une variable le nombre de '.' d'une chaîne de caractère :
#Comptage du nombre de '.'
chaine=$1


n=$(echo $chaine | tr -cd '.' | wc -c )
return [$n]


Après cela, dans un programme C, j'appel avec system ce script pour récupérer la valeur de $n :

nombre_points = system(chemin);


Seulement, après un printf de nombre_points, je n'ai jamais ce qu'il faut. Le script shell fonctionne très bien lorsque je fais un echo $n, mais impossible de retourner la valeur quelque soit la syntaxe que j'utilise...

Si quelqu'un avait une solution,
merci d'avance

2 réponses

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
2 mai 2013 à 21:15
Bah déjà , autant tout faire en C :

#include <stdio.h>

size_t count_dot(const char *s) {
    size_t count = 0;
    for (; *s; s++) {
        if (*s == '.') count++;
    }
    return count;
}

int main() {
    const char * s = "Bonjour. Au revoir...";
    printf("%s --> %d\n", s, count_dot(s));
    return 0;
}


Résultat :

Bonjour. Au revoir... --> 4


En effet l'utilisation de la commande "system" rend ton programme écrit en C dépendant d'un script (pourquoi pas dans l'absolu) et souvent du système sur lequel est lancé le programme (par exemple écrire system("PAUSE"), comme on le voit souvent, est une mauvaise approche). En fait pour faire le travail proprement il faudrait faire des trucs dans ce genre :
https://stackoverflow.com/questions/903864/how-to-exit-a-child-process-and-return-its-status-from-execvp

De manière générale pour appeler un programme tiers (ici ton script shell) il est mieux d'utiliser la commande execvp.

Supposons que j'ai un script plop.sh qui contiennent :

#!/bin/bash
exit $(echo $1 | tr -cd '.' | wc -c )


J'obtiens bien le résultat attendu :

(mando@silk) (~) $ sh plop.sh "Bonjour. Au revoir..."
(mando@silk) (~) $ echo $?
4


Si on veut vraiment utiliser la fonction "system", pour rattraper ça dans un programme C en utilisant system il faut comme indiqué dans le man utiliser WEXITSTATUS :
https://linux.die.net/man/3/system

#include <stdio.h>
#include <stdlib.h>

int main() {
    int ret = WEXITSTATUS(system("/home/mando/plop.sh \"Bonjour. Au revoir...\""));
    printf("--> %d", ret);
    return 0;
}


Bonne chance
0
Bonjour Mamiemando,

Effectivement, tout faire en C aurait été plus simple, mais utiliser le script est la méthode qui m'est imposée, je suis donc obligé de faire de cette façon.

effectivement, je ne connaissais pas WEXITSTATUS, et je pense que cela va beaucoup m'aider.

Merci beaucoup pour ton aide, je reposterai si jamais mais je pense pouvoir m'en sortir ainsi.

Merci à toi !
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
3 mai 2013 à 07:37
Je t'en prie :-) Bonne continuation !
0