我不知道为什么我会得到意想不到的语法'(错误
#!/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 :(得分:5)
呃,因为你有大量语法错误。
当前问题是你在cat
之前有一个不成对的单引号,它将awk脚本暴露给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
这会将useless cat | 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
变量BogoFilter
和DirBogoDict
将它们暴露给子shell(或者只是内联它们 - 为什么需要它们?首先是变量?将命令名称放在变量中是特别奇怪的;只需更新PATH
然后只需使用命令的名称。
一般情况下,如果您发现自己多次输入相同的命令,则应该考虑如何避免这种情况。这称为DRY principle。
答案 1 :(得分:1)
语法错误是由于引用错误造成的。要循环输出的表达式应该是command substitution syntax($(...)
或反引号),而不是单引号。