2009-08-04 5 views
1

Ce qui suit est un script que j'ai écrit pour exécuter un exécutable ./runnable sur l'argument/fichier d'entrée input.Erreur dans le script bash lors de la lecture d'un fichier

Il prend l'entrée standard d'un autre fichier appelé final_file et le sort dans un fichier appelé outfile. Il y a 91 lignes dans final_file (c'est-à-dire, 91 entrées séparées séparées par un espace standard) et par conséquent le script bash doit appeler l'entrée ./runnable 91 fois. Mais, je ne sais pas pourquoi il appelle une seule fois. Des suggestions sur ce qui ne va pas?

#!/bin/bash 

OUTFILE=outfile 
(

a=0 

while read line 
do 

    ./runnable input 
    echo "This is line number: $a" 
    a='expr $a+ 1' 

done<final_file 

) >$OUTFILE 

Pour clarifier, le final_file ressemble

_ _DATA_ _ 
2,9,2,9,10,0,38 
2,9,2,10,11,0,0 
2,9,2,11,12,0,0 
2,9,2,12,13,0,0 
2,9,2,13,0,1,4 
2,9,2,13,3,2,2 

et ainsi de suite. Une ligne, à la fois, est l'entrée standard. Le nombre de lignes dans final_file correspond au nombre de fois que l'entrée standard est donnée. Donc, dans le cas ci-dessus, le script devrait fonctionner six fois puisqu'il y a six lignes.

Répondre

3

Je hasarde que ./runnable cherche tout au long stdin. Si aucune entrée n'est laissée à read, la boucle while se termine après une itération.

Raisonnement: votre exemple Works For Me(TM), en remplaçant un fichier que j'arrive d'avoir (/etc/services) pour final_file et commentant la ligne qui invoque ./runnable.

D'autre part, si je remplace l'invocation ./runnable avec une seule ligne qui cherche simplement et rejette l'entrée standard (par exemple, cat - > /dev/null ou perl -ne 1), je reçois le comportement que vous décrivez.

(Notez que vous voulez ou $() autour des accents graves de l'appel à expr.)

0
  • Exécutez votre script shell avec l'option -x pour une sortie de débogage.
  • Ajouter echo $line après votre while read line; do
  • Notez que while read line; do echo $line; done ne lit pas entrée séparés par un espace, il lit ligne d'entrée séparée.
+0

@Zan: Faire qui confirme le fait que le script est en train de lire que la première ligne de « finalfile » et non de repos. Mais, je veux savoir comment résoudre ce problème ou ce qui se passe sur ce qui le fait faire la même chose. – shubster

Questions connexes