Script Shell - Shell/Batch - Programmation
Marsh Posté le 23-05-2005 à 15:02:21
Uh huh.
Bien évidemment, tout le monde ici connait le format du fichier texte dont tu souhaites extraire les données.
Quoiqu'il en soit, selon le format du fichier, tu peux réaliser ceci soit en coordonnant les commandes "cat" et "cut", soit en utilisant "awk".
Marsh Posté le 23-05-2005 à 15:16:02
En fait, j'aimerais savoir de quelle facon mon script doit etre structuré. Admettons que dans le fichier temp.txt il y a 25.2° et dans date.txt 23 May 2005. Comment faire ? Merci
Marsh Posté le 23-05-2005 à 15:38:23
Je ferais bien un truc comme ça, si c'est du ligne à ligne (dans le cas contraire, utiliser la commande 'join') :
Code :
|
Il y a peut-être une méthode plus propre.
Marsh Posté le 24-05-2005 à 10:35:31
MErci pourton aide mais ça ne marche pas. J'ai donc testé avec awk, je pense que c'est avec cette commande qu'il faut faire mais j'ai une erreur.
Voici mon script
Code :
|
La deuxieme ligne fonctionne, normal, mais c'est au niveau de la premiere, j'aimerai recuperer la variable $temp
Erreur affichée
./relevetemp.sh: line 2: =:command not found
J'ai essayé plusieurs syntaxes mais je n'arrive pas a garder la variable
Merci de votre aide
Marsh Posté le 24-05-2005 à 11:04:42
Citation : MErci pourton aide mais ça ne marche pas. |
Si.
Tu as dû mal recopier, notament au niveau des backquotes d'exécution (caractères ALT-GR + 7 : `).
Ou alors, il y a quelque chose que tu n'as pas dit au niveau du format des fichiers.
Citation : La deuxieme ligne fonctionne, normal, mais c'est au niveau de la premiere, j'aimerai recuperer la variable $temp |
Tout d'abord, c'est pas des double-quotes qu'il faut mettre ici, mais des backquotes.
Ensuite, si tu as mis "$2" c'est, j'imagine, parce que la température est sur la deuxième colonne de données de ton fichier ?
Si oui, alors évidemment on ne peut pas t'aider si tu persistes à ne pas indiquer le format des fichiers que tu traites.
Si non, alors pourquoi "$2" ?
Et apparemment, si awk fonctionne comme tu le souhaites, c'est qu'il n'y a qu'une seule ligne dans tes fichiers ?
Si c'est ça, c'est encore un truc que tu n'as pas dit sur tes fichiers.
Si non, alors tu es au courant que ta variable contiendra toute la première colonne de ton fichier ?
Marsh Posté le 24-05-2005 à 11:31:11
Alors, ce sont des fichiers au format .txt
Ils ne contiennent qu'une seule ligne car le fichier est mis a jour toutes les minutes, donc les données sont a chaque fois ecrasées.
Je met ici ce que contient le fichier lasttemp.txt
Tue May 24 11:43:03 CEST 2005
Et ici le fichier lasttemp.txt
-temperature: 28.50 , Celsius
Voici ce que contiennent mes fichiers.
Merci de ton aide Elmoricq
Marsh Posté le 24-05-2005 à 12:07:01
Dans ces cas là, c'est extrêmement simple, et la boucle que j'ai mise est inutile (et erronée mais, eh, je ne pouvais pas le savoir).
Pour la date, tu veux la récupérer dans un format particulier, ou telle qu'elle est dans le fichier ?
Exemple pour une date récupérée au format dd MMM yyyy :
Code :
|
Et pour le cas où tu voudrais la date telle quelle :
Code :
|
Fais attention aux quotes lorsque tu recopies, de façon à ne pas confondre les quotes simples (car. ' : chaîne de caractères non interprétée par le shell), les doubles quotes (car. " : chaîne de caractères dont le contenu est interprété), et les backquotes (car. ` : chaîne exécutée dans un sous-shell)
Marsh Posté le 24-05-2005 à 13:21:48
Nikel, ca marche !
Marsh Posté le 24-05-2005 à 13:55:33
J'ai une autre question maintenant : je voudrais envoyer un mail si le seuil de temperature est depassé.
J'ai donc ca pour le moment :
Code :
|
Pour la suite je bloque
Marsh Posté le 24-05-2005 à 14:39:43
Le test n'est pas bon.
Il faut impérativement un espace entre ce qu'il y a entre les crochets, et les crochets eux-mêmes.
De plus, pour tester des numériques, il faut utiliser les opérateurs type -eq (equal), -ne (not equal), -lt (lower than), -le (lower or equal), -gt (greater than), -ge (greater or equal)
Ensuite, ton if n'est pas bon : il doit être suivi de "then".
Enfin, il faut savoir que "mail" lit le message à envoyer sur l'entrée standard. Tu dois donc user de redirections pour parvenir à tes fins.
Ici, on va demander au shell de rediriger un bloc de texte jusqu'à rencontrer le mot "EOMAIL" (c'est personnel, mais j'utilise toujours "EO(quelque chose)" pour dire : "End Of ..." ; on peut choisir le délimiteur que l'on veut)
Ce qui donne donc :
Code :
|
EDIT : pour le mot marquant la fin de la redirection, celui-ci doit obligatoirement débuter en début de ligne. Pour ça que le mot "EOMAIL" n'est pas indenté comme le reste dans le code que j'ai écrit. Y a moyen de faire autrement, mais pour le moment je pense qu'il serait bon de s'en tenir là
Marsh Posté le 24-05-2005 à 14:57:45
La poste sur lequel je travail n'étant pas encor relié au réesau, j'ai voulu dans un premier temps tester la condition
Code :
|
Le problème, c'est qu'il m'affiche "bad" même si la température n'a pas dépassé 30°.
EDIT : je suis en SHELL, /bin/sh. Comment fait-on pour transformer un type ?
Marsh Posté le 24-05-2005 à 15:14:21
Et si tu lisais les réponses ?
Avec -gt ça m'affiche l'erreur suivante
-/releveTemp.sh: line6: [: 29.50: integer expression expected
Marsh Posté le 24-05-2005 à 15:54:28
Euh, ok, mais ce que je voulais savoir c'est s'il y avait bien ta température dans $temp.
Parce que j'ai des doutes : ce test fonctionne parfaitement bien.
Ou alors, éventuellement, c'est ta variable LC_NUMERIC qu'est pas bonne ? Mais je n'y crois pas trop.
Marsh Posté le 25-05-2005 à 08:07:12
Code :
|
Que je mette supérieur ou inferieur a $alert, ca m'affichera quand même la température. -gt c'est la même chose, je vois pas ou ca poserais un problème nan ?
Code :
|
Même avec elif ca m'affiche toujours la température
Marsh Posté le 25-05-2005 à 09:45:23
Tu as contrôlé le contenu de $temp, comme je t'ai dit ?
Parce que je n'arrive pas à reproduire ton erreur. Chez moi, ça fonctionne.
Marsh Posté le 25-05-2005 à 09:54:08
Tu as contrôlé le contenu de $temp
Le controler avec un echo ? Si c'est le cas, il m'affiche correctment la température
Marsh Posté le 25-05-2005 à 09:59:39
Si tu tapes :
locale -k LC_NUMERIC |
Que vaut "decimal_point" ?
(mais je doute que ça vienne de là)
Et pour ta remarque sur la différence entre ">" et "-gt" : > compare des alphanumériques, alors que -gt compare des numériques.
Dans le premier cas, les chaînes de caractères sont comparées lettre par lettre, par leur valeur. Dans le second, la chaîne est d'abord convertie en nombre, et traitée tel quelle.
Ce qui signifie par exemple que [ "01" = "1" ] retourne faux, alors que [ "01" -eq "1" ] retourne vrai, par exemple.
Marsh Posté le 25-05-2005 à 10:12:04
[quotemsg=1096001,21,14993]
Si tu tapes :
locale -k LC_NUMERIC |
Que vaut "decimal_point" ?
(mais je doute que ça vienne de là)
quotemsg]
Decimal point =","
Ca vient peut etre de la étant donné que ma température s'affiche avec un point : 24.12 au lieu de 24,12 Est-ce ca ?
Marsh Posté le 25-05-2005 à 10:20:01
Peut-être.
Chez moi, test s'en moque, mais à tout hasard essaie de remplacer la ligne :
Code :
|
par
Code :
|
Et teste ensuite en utilisant -gt
Marsh Posté le 25-05-2005 à 10:31:03
En remplacant le . par la , ca fonctionne : 24.12 remplace par 24,12 Mais ca affichera quand meme la température, que ce soit < ou > . Avec -gt, toujours la même erreur
Code :
|
Marsh Posté le 25-05-2005 à 10:34:34
./releveTemp.sh: line6: [: 24,12: integer expression expected |
Je ne parviens pas à reproduire cette erreur.
Hypothèse : ta version de test n'aime pas les virgules ?
Essaie avec :
temp=`awk '{ print $2 }' lasttemp.txt | cut -d'.' -f1` |
Marsh Posté le 25-05-2005 à 10:43:49
EDIT : ca marche avec le cut !
EDIT 2 : si je met pas d'espace entre # et ! ca ne fonctionne pas
Je test la fontion else
Marsh Posté le 25-05-2005 à 10:45:41
Euh, ton espace entre le '#' et le '!' du shebang, c'est une erreur de recopie ou c'est réellement comme ça dans ton script ?
Autrement, aucune erreur chez moi.
Marsh Posté le 25-05-2005 à 10:52:13
C'est bon, tout fonctionne ! Vraiment merci beaucoup de ton aide !
Marsh Posté le 25-05-2005 à 11:42:29
Citation : EDIT 2 : si je met pas d'espace entre # et ! ca ne fonctionne pas |
Ca signifie soit que "sh" n'est pas dans /bin, auquel cas il faut changer le chemin, soit qu'il y a quelque chose dans ton script qui ne passe pas en Bourne shell, mais qui passe dans ton shell courant (probablement ksh).
Mais avec un espace, ce n'est plus un shebang mais un commentaire normal. Ce qui signifie qu'une personne qui tournera, par exemple, en csh, et qui exécutera le script, ne pourra pas le faire fonctionner.
Marsh Posté le 25-05-2005 à 11:50:06
Je viens de vérifier, sh est biens dans /bin
Y a t'il un moyen pour corriger ce problème qui n'en est pas un pour le moment ?
J'ai continué mon script pour l'envoi de mail, j'ai repris ton script
Code :
|
Il manque un " , apres l'email il y en a un, il faut le placer ou le premier " ?
Marsh Posté le 25-05-2005 à 11:52:30
Pour le ", c'est une erreur de ma part, tu peux l'enlever carrément.
Pour le problème du shebang, il faudrait que tu nous dises quelle erreur tu as lorsque tu l'inclus.
Marsh Posté le 25-05-2005 à 11:58:28
Aucun problème a l'execution, c'est juste que tu as dit que ca risquerait de poser un problème plus tard, c'est pour ça. LA ca marche tres bien. J'ai plus qu'a relié la machine au réseau pour verifier l'envoi de mail. Encore merci !
Marsh Posté le 25-05-2005 à 12:03:38
Je parlais de :
Citation : EDIT 2 : si je met pas d'espace entre # et ! ca ne fonctionne pas |
Il est très, très fortement conseillé d'avoir un shebang pour le script.
A moins que tu ne l'invoques que par "sh tonscript.sh".
Maintenant si tu n'en veux pas, c'est toi qui voit.
Marsh Posté le 25-05-2005 à 12:44:40
Mon script releveTemp.sh ke l'execute avec ./releveTemp.sh
Marsh Posté le 25-05-2005 à 13:28:05
Ce qui signifie qu'il est interprété par le shell courant.
Si ce shell courant n'est pas sh (ou, à la limite, ksh), il risque d'y avoir des surprises.
Marsh Posté le 25-05-2005 à 17:48:49
Non justement, il est interprete par le programme donne dans le shebang. C'est avec ". ./releveTemp.sh" qu'il serait interprete par le shell courant.
Marsh Posté le 25-05-2005 à 17:52:27
matafan a écrit : Non justement, il est interprete par le programme donne dans le shebang. C'est avec ". ./releveTemp.sh" qu'il serait interprete par le shell courant. |
Oui, mais il n'y a pas de shebang justement !
J'insiste depuis trois message pour qu'il en mette un.
Marsh Posté le 23-05-2005 à 14:58:07
J'aimerais créer un script en Shell qui permetrait de récuperer des informations dans un fichier .txt
En fait, le sujet est le suivant :
Je récupere la température grâce à une sonde et je l'affiche sur un graphique avec le logicielle rrdtool. Un script checktemp.sh permet en fait de recuperer la date et la temperature d'o* les fichiers date.txt et temp.txt
J'aimerai donc avoir un script qui permettrai de récuperer la date et la temperature de ces fichiers txt
Débutant sous Linux, désolé si ma question n'est pas très explicite. Je reformulerai selon vos demandes.