2015-06-30 61 views
-1

我有一个可以作为运行脚本./analyze file.txt的file.root log.txt的 file.txt的输入文件,其中包含它们的路径可执行根目录的文件,其他人是输出。我的问题是我有近30个输入文件,我不想每次都写下命令来运行代码。 Bash脚本会很好,但我没有管理。它给出了一个错误。看看下面的代码的例子,我尝试运行:bash脚本来阅读我的文件,执行命令

#!/bin/bash 

do 

echo 

./analyze runlist1.txt runlist1.root log1.txt 

./analyze runlist2.txt runlist2.root log.txt 

./analyze runlist3.txt runlist3.root log.txt 

./analyze runlist4.txt runlist4.root res4.txt 

done 

我得到的错误“语法错误附近意外的标记'做””,任何帮助将不胜感激。

+1

看起来你只是削减了一些代码。 'do'''' done'本身什么都不做,它们是循环的一部分,例如 'for i in 1 2 3;做echo $ 1; done' 只是从你的脚本 – vlp

+0

@vlp将其删除是的,我在bash没有好。但是你是对的,所以在阅读myline和./analyze {$ myline}时,使用某种东西就像> cat runlist1.txt |? – aQuestion

+0

是的,但使用'./analyze $ {myline}'。我想runlist1.txt有每行分析调用的输入文件和两个输出文件的行。 –

回答

0

当所有文件被称为Brunsplit.txt,下面将帮助

for file in Brunsplit*.txt; do 
    tmp=${file%.txt} 
    nr=${tmp#Brunsplit} 
    ./analyze ${file} runlist${nr}.root res${nr}.txt 
done 

TMP和NR瓦尔都充满了特殊的语法,它是像切断.TXT在距离年底Brunsplit开始。

0

像评论指出别人的do断章取义是一个语法错误(这是一个有效的关键字forwhileuntil控制语句之后)。

显然,有输入文件名和相应的日志文件名之间没有系统的映射,所以你需要一个脚本保持这种映射。事情是这样的,那么:

while read suffix logfile; do 
    ./analyze "runlist$suffix.txt" "runlist$suffix.root" "$logfile" 
done <<'____HERE' 
    1 log1.txt 
    2 log.txt 
    3 log.txt 
    4 res4.txt 
____HERE 

here文档(<<分隔符分隔符单独位于一行的东西)就像是一个文本文件,但它被嵌入的脚本的一部分。

+0

哇!谢谢tripleee这个答案超出了我的逻辑,的确如此。 – aQuestion

0

检查它的原始,但修改后的版本。

!/斌/庆典

文件中Brunsplit1.txt Brunsplit2.txt

回声$文件

./analyze Brunsplit1.txt runlist1.root RES1 .txt

./analyze Brunsplit2.txt runlist2.root res2.txt

完成

谢谢。

+1

在每个循环中,您将分析这两个文件。当编号很简单时,只需在1 2中使用'for nr; do ./analyze Brunsplit $ {nr} runlist $ {nr} .root res $ {nr} .txt; done'。更难:看@tripleee的解决方案。 –

+0

@WalterA谢谢WalterA,那很有帮助。 – aQuestion