2010-02-04 334 views
3

我在bash shell脚本中遇到问题。这个脚本应该执行另一个shell脚本(这里是./script),脚本的输出被重定向到一个文件(tmp)。然后应该逐行阅读文件,并且对于每一行应该执行相同的脚本(./ script),并将行作为参数,并将结果存储在文件(tmp1)中。最终这些结果应附加到第一个文件(tmp)。从shell脚本逐行读取文件

我贴我的脚本如下:

./script $1 $2 > tmp 
cat tmp | while read a 
do 
./script $a $2 >> tmp1 
done 

cat tmp1 | while read line 
do 
./script $line $2 >> tmp 
done 

我收到以下错误,当我执行脚本“./script:行11:语法错误:意外的文件结尾”

任何人都可以请帮我在这里?

非常感谢。

+0

显示您的“维基”和“脚本”脚本。 ! – ghostdog74 2010-02-04 09:09:37

+0

我在下面回答了这个问题。我不知道它执行的java文件的内容。我只对它产生的输出感兴趣。 – assassin 2010-02-04 09:29:08

回答

3

脚本文件具有DOS/Windows行结尾。试试这个命令,然后运行脚本:

​​

你可能编辑使用Windows编辑文件,那就是把\r(0X0D)到每一行的末尾。这可以通过使用dos2unix删除。

+0

我没有想到,你可能是对的。 – ghostdog74 2010-02-04 14:06:38

+0

@ ghostdog74:我创建了一个由'while'循环组成的测试脚本,并在其上运行反向('unix2dos')。当我在'dash'和'bash'下运行结果时,他们都给出了意想不到的EOF错误。 – 2010-02-04 14:53:47

1

shell通常在空白处分裂。你可以把它劈在新行写,朝上方,

IFS=' 
' 

不过,我觉得你现在要做的可能不适合壳的东西,可能是由Perl或红宝石得到更好的服务。

+0

嘿..谢谢你的回复。 Perl或Ruby的问题是我不知道这两种语言中的任何一种:P,因此需要一些时间来学习它们。 – assassin 2010-02-04 08:46:05

+0

你想做的事情可以用shell来完成,如果你不知道其他语言,就坚持shell。 – ghostdog74 2010-02-04 08:47:18

+0

哎...用你的解决方案,我收到以下错误 “:找不到命令: ./wiki_tree:第12行:附近意外的标记语法错误'做‘ ./wiki_tree:第12行:'做’ ” – assassin 2010-02-04 08:49:54

1

失去所有的猫!他们是不必要的。我想summ_tmp是一个现有的文件?

#!/bin/bash 
set -x 
./wiki $1 $2 > tmp 
while read -r a 
do 
    ./wiki $a $2 >> tmp1 
done < summ_tmp 

while read -r line 
do 
    ./wiki $line $2 >> tmp 
done < tmp1 

随着你在做什么,你可能需要重构你的“./script”来消除不必要的步骤。如果时间不长,请显示您的“./script”的功能。显示您所需的输出并在可能的地方显示相关输入文件的示例

在您的脚本(wiki和./script)中放置-x以帮助您进行调试。

+0

嗨, 当我执行脚本时出现以下错误: ./wiki_tree:第5行:意外标记'done'附近的语法错误 '/ wiki_tree:第5行:'done assassin 2010-02-04 08:56:41

+0

注释掉所有while循环,并且只执行wiki。你看见什么了?显示所有相关信息,例如Wiki和脚本。 – ghostdog74 2010-02-04 09:06:44

+0

评论完所有的while循环后,它的作品.... btw ./wiki和./script是相同的(我很抱歉这个错误)。我将脚本重命名为wiki ... – assassin 2010-02-04 09:24:31

0

或者,您可以使用xargs - 这会在文件的每一行执行一个命令,这正是您想要的。

您可以

xargs <tmp1 -n1 -IXXX ./script XXX $2 >>tmp 

-n1手段代替

cat tmp1 | while read line 
do 
    ./script $line $2 >> tmp 
done 

阅读从输入一次一行,

-IXXX意味着XXX替换与被读入的行 - 默认是将它追加到命令行的末尾。

+0

它仍然显示此错误:第5行:语法错误:意外的文件结束。我们如何表示脚本以bash脚本结束?也许这就是问题 – assassin 2010-02-04 09:15:38

+0

@OP,把你的脚本中的set -x设置为帮助你调试 – ghostdog74 2010-02-04 09:23:03

+0

set -x ... ummm你可以请temme我应该把它放在哪里?我对shell脚本很陌生 – assassin 2010-02-04 09:31:47