[Script Shell] Utilisation du FOR
Résolu
Trezeg
Messages postés
73
Date d'inscription
Statut
Membre
Dernière intervention
-
Trezeg Messages postés 73 Date d'inscription Statut Membre Dernière intervention -
Trezeg Messages postés 73 Date d'inscription Statut Membre Dernière intervention -
Bonjour à tous,
J'ai créé un shell qui a pour but d'effectuer un traitement autant de fois qu'il y a la chaine bcp dans le fichier passé en paramètre. Une condition est ajoutée afin de savoir si dans la ligne trouvée avec le mot recherché, apparait l'attribut in (on effectue les opérations) ou out (on s'arrête et on "reboucle").
Voilà ce que cela donne :
Quand je lance ce shell avec en parametre, un fichier contenant un seul bcp , ca marche. Par contre à partir de 2, ca se gate...
Mon for doit être foireux...
Help me please :-//
Merci
Trez
J'ai créé un shell qui a pour but d'effectuer un traitement autant de fois qu'il y a la chaine bcp dans le fichier passé en paramètre. Une condition est ajoutée afin de savoir si dans la ligne trouvée avec le mot recherché, apparait l'attribut in (on effectue les opérations) ou out (on s'arrête et on "reboucle").
Voilà ce que cela donne :
#!/bin/ksh #!/bin/sh #!/bin/bash batchFile=/Mesbatches/$1 echo $batchFile echo $1 for bcp in `grep bcp /Mesbatches/$1 | sed -n '$='` do echo $bcp currentBcp=`grep bcp /Mesbatches/$1 | awk '{print $3}'` # Ce 3eme champ est l'attribut in ou out echo $currentBcp if [ "$currentBcp" = "out" ] then continue else echo "on est dans le if" inputFile=`grep bcp /Mesbatches/$1 | awk '{print $4}'` # Ce 4eme champ est un nom de fichier texte echo "on est dans l'affichage du fichier input" echo $inputFile inputCount=`sed -n '$=' $inputFile` echo "on affiche le nb de lignes du fichier input" echo $inputCount outputFile=/Mesbatches/$1.tmp echo "on affiche le nom du fichier output" echo $outputFile outputCount=`grep 'rows copied' $outputFile | nawk '{print $1}'` echo $outputCount if [ "$inputCount" != "$outputCount" ] then echo "ERROR on batch $1 !!!" echo $inputCount rows in file $inputFile echo $outputCount rows processed in database return 1 fi
Quand je lance ce shell avec en parametre, un fichier contenant un seul bcp , ca marche. Par contre à partir de 2, ca se gate...
$ check.sh b_utor (ce fichier contient 6 fois le terme bcp) /Mesbatches/b_utor b_utor 6 out out out in in in on est dans le if on est dans l'affichage du fichier input /Mesbatches/ut_order_hist.txt /Mesbatches/ut_issue_master_ext.txt /Mesbatches/ut_order.txt /Mesbatches/ut_order_hist.txt /Mesbatches/ut_issue_master_ext.txt /Mesbatches/ut_order.txt on affiche le nb de lignes du fichier input on affiche le nom du fichier output /infotest/prg/files/tmp/uat/b_utor.tmp $J'aimerais que le traitement se fasse pour chaque occurence alors que là, il essaie de le faire 6 fois d'un seul coup...
Mon for doit être foireux...
Help me please :-//
Merci
Trez
A voir également:
- [Script Shell] Utilisation du FOR
- Downloader for pc - Télécharger - Téléchargement & Transfert
- Utilisation chromecast - Guide
- Classic shell - Télécharger - Personnalisation
- Télécharger gratuitement notice d'utilisation - Guide
- Script vidéo youtube - Guide
11 réponses
Salut,
Essaye de changer cette ligne :
Essaye de changer cette ligne :
for bcp in `grep bcp /Mesbatches/$1 | sed -n '$='`par :
for bcp in $(seq $(grep bcp /Mesbatches/$1 | sed -n '$='));-))
La solution du dessus marche pour le nombre d'itération des boucles, mais ne doit pas effectuer le traitement voulu.
Modifie ton script comme ceci :
Modifie ton script comme ceci :
#!/bin/ksh #!/bin/sh #!/bin/bash batchFile=/Mesbatches/$1 echo $batchFile echo $1 OIF=$IFS # sauvegarde du séparateur de champs IFS=$'\n' # initialisation du séparateur de champs (saut de ligne) for bcp in $(grep bcp /Mesbatches/$1) do echo $bcp grep "out" <<<"$bcp" >/dev/null if [ "$?" = 0 ] then continue fi echo "on est dans le if" inputFile=`grep bcp /Mesbatches/$1 | awk '{print $4}'` # Ce 4eme champ est un nom de fichier texte echo "on est dans l'affichage du fichier input" echo $inputFile inputCount=`sed -n '$=' $inputFile` echo "on affiche le nb de lignes du fichier input" echo $inputCount outputFile=/Mesbatches/$1.tmp echo "on affiche le nom du fichier output" echo $outputFile outputCount=`grep 'rows copied' $outputFile | nawk '{print $1}'` echo $outputCount if [ "$inputCount" != "$outputCount" ] then echo "ERROR on batch $1 !!!" echo $inputCount rows in file $inputFile echo $outputCount rows processed in database return 1 fi done IFS=$OIFS # restauration du séparateur de champs par défaut;-))
Salut jipicy,
voici le résultat de l'execution :
voici le résultat de l'execution :
$ check.sh b_utor /Mesbatches/b_utor b_utor check.sh[16]: syntax error at line 21 : `<<' unmatched:-//
A quoi correspond la ligne 21 ?
Note : Peut être faudrait-il mettre la dernière ligne de mon exemple "IFS=$OIFS" à la sortie du 1er "if ... fi" afin de ne pas perturber le déroulement du reste du script.
Note : Peut être faudrait-il mettre la dernière ligne de mon exemple "IFS=$OIFS" à la sortie du 1er "if ... fi" afin de ne pas perturber le déroulement du reste du script.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Je l'avais enlevé car j'ai cru à une faute de frappe ;-)
Cela dit, j'avais essayé sans succès :
Cela dit, j'avais essayé sans succès :
$ check.sh b_utor /Mesbatches/b_utor b_utor check.sh[16]: syntax error at line 21 : `<' unexpected $
Bon vu ton système il doit pas aimer les dernières inventions de bash ;-))
Essaie de parser ta variable comme suit alors :
Essaie de parser ta variable comme suit alors :
echo "$bcp" | grep "out" >/dev/null;-))
Re-
Visiblement il a du mal avec les chemins contenus dans les lignes sélectionnées:
Visiblement il a du mal avec les chemins contenus dans les lignes sélectionnées:
$ check.sh b_utor /Mesbatches/b_utor b_utor grep: can't open /i grep: can't open fotest/prg/uat/scripts/dbElmts/batchM grep: can't open gt/batches/b_utor $
Exécute ton script en mode débogage (set -xv) ou lance-le avec l'option (sh -xv ton_script), pour voir ce qui est mal interprété.
Vu ton système (Solaris) reviens à l'ancienne interprétation avec des quotes inversées ( `...` ) au lieu de "$(...)", on sait jamais ;-))
Vu ton système (Solaris) reviens à l'ancienne interprétation avec des quotes inversées ( `...` ) au lieu de "$(...)", on sait jamais ;-))
Salut jipicy,
J'aimerais revoir mon cheminement afin de trouver une solution. En fait je voudrais stocker toutes lignes contenant les mots "bcp" et " in " (avec un espace avant et après pour in) dans un fichier temporaire:
Aurais-tu une idée ?
Merci pour ton aide.
Trez
J'aimerais revoir mon cheminement afin de trouver une solution. En fait je voudrais stocker toutes lignes contenant les mots "bcp" et " in " (avec un espace avant et après pour in) dans un fichier temporaire:
grep bcp /Mesbatches/$1 | grep " in " > bcp.tmpEnsuite (et c'est là que je rame...) je veux effectuer mon traitement pour chacune des lignes de bcp.tmp (que je n'aurais plus à trier puisque déjà fait) tout en récupérant le 4ème champ pour chacune de ces lignes.
Aurais-tu une idée ?
Merci pour ton aide.
Trez
Merci jipicy,
je suis parvenu à une solution concernant cette histoire de for en procédant de la façon suivante :
Trez
je suis parvenu à une solution concernant cette histoire de for en procédant de la façon suivante :
$ more check.sh #!/bin/ksh #!/bin/sh #!/bin/bash grep bcp Mesbatches/$1 | grep " in " > bcp.tmp while read line do echo "$line\n" inputFile=`echo $line | awk '{print $4}'` echo $inputFile inputCount=`wc -l $inputFile | awk '{print $1}'` echo $inputCount outputFile=/infotest/prg/files/tmp/uat/$1.tmp echo $outputFile outputCount=`grep 'rows copied' $outputFile | nawk '{print $1}'` echo $outputCount if [ "$inputCount" != "$outputCount" ];then echo "ERROR on batch $1 !!!" echo $inputCount rows in file $inputFile echo $outputCount rows processed in database exit 1 fi done < bcp.tmpA+
Trez
il n'a pas l'air d'aimer le seq: Amclt,