2010-02-04 306 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