Bash代码错误意外语法错误

时间:2016-02-16 03:24:06

标签: bash awk

我不知道为什么我会得到意想不到的语法'(错误

#!/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''

2 个答案:

答案 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变量BogoFilterDirBogoDict将它们暴露给子shell(或者只是内联它们 - 为什么需要它们?首先是变量?将命令名称放在变量中是特别奇怪的;只需更新PATH然后只需使用命令的名称。

一般情况下,如果您发现自己多次输入相同的命令,则应该考虑如何避免这种情况。这称为DRY principle

答案 1 :(得分:1)

语法错误是由于引用错误造成的。要循环输出的表达式应该是command substitution syntax$(...)或反引号),而不是单引号。