Retourner une variable
Résolu
Bonjour,
Je possède un script bash qui stock dans une variable le nombre de '.' d'une chaîne de caractère :
Après cela, dans un programme C, j'appel avec system ce script pour récupérer la valeur de $n :
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
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
A voir également:
- Retourner une variable
- Retourner ecran pc - Guide
- Comment retourner une video - Guide
- Comment retourner en arriere sur page ✓ - Forum MacOS
- Retour arrière sur une application - Iphone - Forum iPhone
- Variable d'environnement temp - Forum Word
2 réponses
Bah déjà , autant tout faire en C :
Résultat :
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 :
J'obtiens bien le résultat attendu :
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
Bonne chance
#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
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 !
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 !