2009-08-04 4 views
1

以下は、引数/入力ファイルinputに実行可能ファイル./runnableを実行するために書いたスクリプトです。ファイルを読み取っているときのbashスクリプトのエラー

final_fileという別のファイルから標準入力を受け取り、outfileというファイルに出力します。 final_fileに91行(すなわち、91個の異なる標準スペースで区切られた入力)があるので、bashスクリプトは./runnable入力を91回呼び出す必要があります。

しかし、なぜそれが1回だけ呼び出すのかわかりません。何が起こっているのかについての提案は間違っていますか?明確にするために

#!/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 

final_fileはそうで

_ _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 

とのように見えます。一度に1行が標準入力です。 final_fileの行数は、標準入力が与えられた回数に対応します。したがって、上記の場合、スクリプトは6行と同じくらい6回実行する必要があります。

答えて

3

私は./runnableは標準入力を介してすべての道を追求することハザードます。入力がreadのままでない場合、whileループは1回の繰り返しの後に終了します。

推論:あなたの例作品のために私(TM)final_fileのために私は(/etc/services)を持って起こるファイルを代入して./runnableを起動する行をコメントアウト。一方

私は単純に、標準入力(例えば、cat - > /dev/nullまたはperl -ne 1)を追求し、破棄ワンライナーで./runnable呼び出しを置き換えるならば、私はあなたが記述動作を取得。

(あなたがexprへの呼び出しの周りにバッククォートや$()を望んでいることに注意してください。)

0
  • -x オプションを使用してシェルスクリプトを実行して、デバッグ出力を行います。
  • while read line; do echo $line; doneは、スペースで区切られた入力を読んでいないことをごwhile read line; do
  • 注後echo $lineを追加し、それがライン分離入力読み取ります。
+0

@Zan:それはスクリプトを休ま「finalfile」の最初の行のみを読み取り、されていないという事実を確認して行います。しかし、私はこの問題を解決する方法、または同じことをしていることをやっていることを知りたい。 – shubster

関連する問題