2016-02-16 40 views
2

我不知道爲什麼我收到了意想不到的語法「(ERR猛砸代碼錯誤意外的語法錯誤

#!/bin/bash 
DirBogoDict=$1 
BogoFilter=/home/nikhilkulkarni/Downloads/bogofilter-1.2.4/src/bogofilter 
echo "spam.." 

for i in 'cat full/index |fgrep spam |awk -F"/" '{if(NR>1000)print$2"/"$3}'|head -500' 
do 
     cat $i |$BogoFilter -d $DirBogoDict -M -k 1024 -v 
done 

echo "ham.." 
for i in 'cat full/index | fgrep ham | awk -F"/" '{if(NR>1000)print$2"/"$3}'|head -500' 
do 
     cat $i |$BogoFilter -d $DirBogoDict -M -k 1024 -v 
done 

錯誤:

./score.bash: line 7: syntax error near unexpected token `(' 
./score.bash: line 7: `for i in 'cat full/index |fgrep spam |awk -F"/" '{if(NR>1000)print$2"/"$3}'|head -500'' 
+0

請清理您的代碼...每行上的四個前導空格會創建一個代碼塊(代碼塊由兩個返回值分隔)。這是超級難以閱讀......沒有冒犯。 –

+1

對不起,abt :) :) –

+0

你也可以粘貼你的確切錯誤,你收到? –

回答

5

呃,因爲你有海量語法錯誤。

目前的問題是,在將012k暴露給shell之前,您有一個不成對的單引號,這個腳本當然不能將其解析爲shell腳本代碼。

大概你想用反引號代替單引號,儘管你should actually not read input with for

隨着重構公平一點,你可能要像

for type in spam ham; do 
    awk -F"/" -v type="$type" '$0 ~ type && NR>1000 && i++<500 { 
     print $2"/"$3 }' full/index | 
    xargs $BogoFilter -d $DirBogoDict -M -k 1024 -v 
done 

這refactors的uselesscat | grep | awk | head成一個單一的awk腳本,並避免在每個輸出線傻循環。我假設bogofilter可以讀取文件名參數;如果沒有,你需要稍微重構xargs。如果你能管的所有文件一氣呵成,儘量

... xargs cat | $BogoFilter -d $DirBogoDict -M -k 1024 -v 

,或者如果你真的需要一個傳遞的時間,也許

... xargs sh -c 'for f; do $BogoFilter -d $DirBogoDict -M -k 1024 -v <"$f"; done' _ 

...在這種情況下,您需要export變量BogoFilterDirBogoDict將它們暴露給subshel​​l(或者只是內聯它們 - 爲什麼你首先需要它們作爲變量?把變量中的命令名稱特別奇怪;只需更新你的PATH,然後簡單地使用命令的名字)。

一般來說,如果您發現自己多次輸入相同的命令,您應該考慮如何避免這種情況。這被稱爲DRY principle

+0

Tee hee,我們可以通過將$ 1作爲$ 0傳遞給子shell來欺騙。但是這變得相當模糊。 'PATH = /家庭/ nikhilkulkarni /下載/ bogofilter-1.2.4/src目錄/:$ PATH;東西| xargs sh -c'for f;做bogofilter -d「$ 0」-M -k 1024 -v <「$ f」;完成'「$ 1」' – tripleee