2009-08-04 109 views
1

以下是我为在参数/输入文件input上运行可执行文件./runnable而编写的脚本。读取文件时在bash脚本中出错

它从另一个名为final_file的文件获取标准输入,并将其输出到名为outfile的文件。 final_file中有91行(即91个不同的标准空格分隔输入),因此bash脚本应该调用./runnable输入91次。

但是,我不确定它为什么只调用它一次。关于发生了什么问题的任何建议?

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

等。一次一行是标准输入。 final_file中的行数对应于标准输入的次数。所以在上述情况下,脚本应该运行六次,因为有六行。

回答

3

我会大胆地说,./runnable寻求一路过关斩将标准输入。由于没有输入到readwhile循环在一次迭代之后结束。

推理:你的榜样对我的作品(TM),为final_file替换文件我碰巧有(/etc/services)和注释掉调用./runnable行。

在另一方面,如果我有一个班轮简单地寻求并丢弃标准输入替换./runnable调用(例如,cat - > /dev/nullperl -ne 1),我给你描述的行为。

(请注意,你要反引号或$()呼叫周围expr

0
  • 对于某些调试输出,使用-x 选项运行您的shell脚本。
  • 添加echo $line后您的while read line; do
  • 注意while read line; do echo $line; done不读空格分开输入时,它读取线分开输入。
+0

@Zan:这样做是确认的事实,该脚本只读取“finalfile”,而不是休息的第一道防线。但是,我想知道如何解决这个问题,或者是怎么解决这个问题。 – shubster 2009-08-04 19:52:28