Rechercher : dans
Par :

Shell script: lire une chaine de caractere da

Dernière réponse le 22 mai 2008 à 19:56:06 kloorane, le 30 avr 2007 à 13:30:47 
 Signaler ce message aux modérateurs

Bjr à tous,
Je sis débutant en shell script.
En fait je veux créer un programme en korn shell qui va me permettre d'aller lire une chaine de caractère dans un fichier et me retourner sa valeur.
y a t il une commande qui pemret de faire ça?
mERCI D AVANCE

Configuration: Windows XP
Internet Explorer 7.0

Meilleures réponses pour « shell script: lire une chaine de caractere da » dans :
Exécuter un script shell VoirExécution d'un script Pour pouvoir exécuter un script ou un programme en ligne de commande il y a plusieurs possibilités : 1. Le chemin absolu 2. Le chemin relatif 3. Modifier la variable PATH Note: Le Sha-Bang Premièrement,...
[CCM] Utiliser des caractères spéciaux VoirVous pouvez utiliser des caractères spéciaux dans vos messages sur les forums de CCM. Vous pouvez: Soit utiliser la table de caractères Windows (charmap.exe) et copier-coller les caractères dans le message. Soit utiliser les entités...
Les chaînes de caractères en C++ VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C++, une...
Langage C - Les chaînes de caractères VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C, une chaîne...
Linux - Le shell VoirIntroduction au shell L'interpréteur de commandes est l'interface entre l'utilisateur et le système d'exploitation, d'où son nom anglais «shell», qui signifie «coquille». Le shell est ainsi chargé de faire l'intermédiaire le système...

1

jipicy, le 30 avr 2007 à 13:33:12

Salut,

Normalement avec "grep" (man grep) ça doit le faire, mais il faut être plus précis sur ce que tu veux vraiment faire (donnes-nous un exemple concret).

;-)) Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

2

kloorane, le 30 avr 2007 à 13:42:27

Je vais être un peu plus précis.
je veux créer un shell avec la condition suivante:
Tant que
je ne trouve pas la chîne de caractère "toto" dans le fichier "test"qui se trouve dans /app/shell
ne rien faire

Répondre à kloorane

3

jipicy, le 30 avr 2007 à 14:01:10

Re-

Ce que tu veux faire n'est pas très orthodoxe dans le sens où il vaudrait mieux programmer un truc dans le genre :

Tant que "je trouve la chaîne "toto" dans "/app/shell"; faire bla bla bla...

ou alors :

Tant que "je ne trouve pas la chaîne "toto" dans "/app/shell"; faire bla bla bla...

Mais bon voici quand même ce que tu veux (enfin presque) :

grep "toto" /app/shell ; while [ "$?" != 0 ]; do echo "Je ne fais rien"; done
;-))
Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

4

kloorane, le 30 avr 2007 à 14:24:59

Merci pour ta réponse.
En fait ce que je veux faire c'est:
exécuter une commande (par ex ls) qu'une fois j'aurai trouvé la chaine de caractère "toto" ds /app...
a ton avis...

Répondre à kloorane

5

jipicy, le 30 avr 2007 à 14:34:22

grep "toto" /app/shell/test >/dev/null ; if [ "$?" = 0 ]; then ls ; fi ; done
PS. Dans mon message précédent, j'avais oublié de mettre le fichier "test" dans 'grep "toto" /app/shell/test' Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

6

kloorane, le 30 avr 2007 à 14:41:39

Au risque d'être chiant, à quoi sert >/dev/null
Merci pour ton aide

Répondre à kloorane

7

jipicy, le 30 avr 2007 à 14:46:41

Ça redirige ce qui est sensé être envoyé sur la sortie standard (dans notre cas stdout=l'écran), vers une sorte de poubelle virtuelle sans fond. En gros tout ce que tu ne veux pas voir apparaître sur ton écran (ou dans un fichier le cas échéant, tout dépend de la redirection), tu l'envoies vers "/dev/null".

Sans cette directive, en sus du listage de ton répertoire, tu aurais auparavant l'affichage de la ligne contenant "toto".
Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

8

kloorane, le 30 avr 2007 à 17:15:27

J ai l'erreur suivante qui apparaît qd j execute mon script
"syntax error at line 59 : `done' unexpected"
Voila ce que je fais:

grep "Server started in RUNNING mode" /app/bea/wlsa >/dev/null
if [ "$?" = 0 ]
then

trace "Demarrage du serveur"
executer_remote_script $APPLI_SRV $EXPLOIT sys_managesrv.ksh start
retour=$?
if [ $retour -eq 3 ]
then
exit 3;
fi

trace "Fin de Lancement de l'application "

fi
done

En fair, je veux que mon script consulte le fichier wlsa, et qu'il n'execute ce qui vient après le then qu'une fois il y aura la chaine "Server started in RUNNING mode" écrite ds le fichier wlsa.

Help!

Répondre à kloorane

9

jipicy, le 30 avr 2007 à 17:25:00

Affiche ton script en entier, sinon on patauge...

Est-ce qu'il existe un "do" en amont de ton script ? (du fait de : "syntax error at line 59 : `done' unexpected" )
Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

10

kloorane, le 30 avr 2007 à 17:36:10

Non j ai pas de do en amont

Répondre à kloorane

11

jipicy, le 30 avr 2007 à 17:38:39

Supprime le "done" alors ;-))
Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

12

kloorane, le 30 avr 2007 à 17:55:35

ça a l'air de marcher
thanks a lot

Répondre à kloorane

13

jipicy, le 30 avr 2007 à 18:00:33

De rien ;-))
Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

14

kloorane, le 30 avr 2007 à 20:49:08

Slt,
je sollicite encore ton savoir :)
Cette fois je faire une boucle qui permet de chercher une chaine:

grep "Server started in RUNNING mode" /app/wlsa.log >/dev/null

while [ $? != 0 ]
do
grep "Server started in RUNNING mode" /app/wlsa.log >/dev/null
sleep 10
trace "toujours dans la boucle"
done

Normalement ça doit boucler tant que je n'ai pas ma chaine de caractère ds le fichier.
Ce qui n'est pa le cas.
Est ce que j'ai un prob de syntaxe?

Répondre à kloorane

15

jipicy, le 30 avr 2007 à 22:51:18

while [ "$retval" != 0 ]
do
grep "Server started in RUNNING mode" /app/wlsa.log >/dev/null
retval=$?
sleep 10
trace "toujours dans la boucle"
done 
;-)) Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

16

kloorane, le 1 mai 2007 à 14:47:08

Oui mais la var retval a quelle valeur au début, ne faut il pas l'initialiser au départ?

Répondre à kloorane

17

jipicy, le 1 mai 2007 à 17:51:49

Aucune, donc différente de zéro, et de part là même ça passe ;-))
Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

18

kloorane, le 1 mai 2007 à 19:11:58

Est ce qu'on est sur à 100% qu'elle ne peut jamais prendre la valeur 0 au départ?

Répondre à kloorane

19

jipicy, le 1 mai 2007 à 19:18:40

Dans ce cas l'écrire comme ça :

while [ "${retval:=1}" != 0 ]
ou encore comme ça :
while [ "${retval:~1}" != 0 ]
Voir sujet dans la FAQ : le remplacement de variables en shell bash

;-)) Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

20

kloorane, le 2 mai 2007 à 11:56:05

Mais dans ce cas retval aura toujours la valeur 1, la boucle sera infini.
Or moi ce que je veux c'est:

1- Faire le grep "Server started in RUNNING mode" /app/wlsa.log >/dev/null
2- Récuperer le resultat du grep
3-Si cette valeur est différente de 0 refaire le grep tant que la valeur est différente de 0.

A un moment la valeur du grep sera égale à 0 et là il faudra sortir de la boucle.

J'espere que c'est plus clair.
Merci pour ton aide précisese.

Répondre à kloorane

21

jipicy, le 2 mai 2007 à 13:54:03

Mais dans ce cas retval aura toujours la valeur 1, la boucle sera infini.
Non, la valeur "1" n'est attribuée que si la variable n'est pas définie, ce qui est le cas avant la 1ère boucle, mais pas dans les autres boucles.

Quoi qu'il en soit, la 1ère solution marchait aussi, la variable renvoyant une valeur vide différente de "0"...

Voilà un exemple :

jp@MDK:~/tmpfs ssh$ cat kloorane # fichier de référence

Mais dans ce cas retval aura toujours la valeur 1, la boucle sera infini.
Or moi ce que je veux c'est:

1- Faire le grep "Server started in RUNNING mode" /app/wlsa.log >/dev/null
2- Récuperer le resultat du grep
3-Si cette valeur est différente de 0 refaire le grep tant que la valeur est différente de 0.

A un moment la valeur du grep sera égale à 0 et là il faudra sortir de la boucle.

J'espere que c'est plus clair.
Merci pour ton aide précisese

jp@MDK:~/tmpfs ssh$ cat foo.sh # le script
#! /bin/bash

unset retval # on efface la variable


while [ "$retval" != "0" ]
do
grep "jipicy" kloorane # on cherche "jipicy" dans le fichier de référence
retval=$?
sleep 3 # permettra d'introduire le mot "jipicy" en cours d'exécution
echo "Toujours dans la boucle"
done

echo
echo "La valeur a été trouvée"
echo "Arrêt du script"

exit 0

jp@MDK:~/tmpfs ssh$ sh foo.sh # lancement du script

Toujours dans la boucle # Pas de valeur "jipicy" de trouver
Toujours dans la boucle # idem
Toujours dans la boucle # idem
Toujours dans la boucle # La valeur est envoyée
jipicy                                   # la valeur est trouvée
Toujours dans la boucle # la boucle s'arrêtera après ça 

La valeur a été trouvée
Arrêt du script

jp@MDK:~/tmpfs ssh$
La valeur a été envoyée pendant l'exécution du script sous la forme :
echo "jipicy" >> kloorane
;-))
Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

22

kloorane, le 2 mai 2007 à 15:13:01

J'ai essayé avec les 2 méthodes:
while [ "$retval" != "0" ]
et while [ "${retval:=1}" != 0 ]
Ca marche bien la 1ere fois ms qd je reteste une 2ème fois ça marche pas!
On dirait que retval garde l'ancienne valeur.
As tu une idée?

Répondre à kloorane

23

jipicy, le 2 mai 2007 à 15:38:11

Lance ton script en mode débogage ("set -xv") et vois ce que ça donne...

"set +xv" pour revenir au mode normal.
Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

24

sabir, le 21 mai 2008 à 13:50:07

Bonjour,


j'ai la ligne suivante :

export HORCMINST="29"
SVP, comment puis-je afficher le chiffre 29 seul.?
awk ??

Merci

Répondre à sabir

25

jipicy, le 21 mai 2008 à 13:59:24

Salut,

 echo 'export HORCMINST="29"' | grep -o '[0-9]\+'
;-))
JP - Éleveur de pingouins -
Faites un geste pour l'environnement, fermez vos fenêtres et adoptez un manchot.

Répondre à jipicy

26

 sambooor, le 22 mai 2008 à 19:56:06

Salut
merci pour ta reponse, ce ke tu ma di ca marche bien. mais jai deja trouver une autre solution, en fait, le chiffre entre guillemet change, ex export HORCMINST="1033". demain je tenvoi la solution paseke mnt chui chez moi (pas a mon bureau)

salutation

Répondre à sambooor