Bash代码错误意外语法错误

1 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
Run Code Online (Sandbox Code Playgroud)

错误:

./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''
Run Code Online (Sandbox Code Playgroud)

tri*_*eee 5

呃,因为你有大量的语法错误.

直接的问题是,在将catAwk脚本暴露给shell 之前,您有一个不成对的单引号,当然这不能将其解析为shell脚本代码.

大概你想要使用反引号而不是单引号,尽管你实际上不应该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
Run Code Online (Sandbox Code Playgroud)

这将无用的 重构cat | grep | awk | head为单个Awk脚本,并避免了每个输出行上的愚蠢循环.我假设bogofilter可以读取文件名参数; 如果没有,你需要xargs稍微重构一下.如果您可以一次性管道所有文件,请尝试

... xargs cat | $BogoFilter -d $DirBogoDict -M -k 1024 -v
Run Code Online (Sandbox Code Playgroud)

或者,如果你真的需要一次传递一个,也许

... xargs sh -c 'for f; do $BogoFilter -d $DirBogoDict -M -k 1024 -v <"$f"; done' _
Run Code Online (Sandbox Code Playgroud)

...在这种情况下,您将需要export变量BogoFilter并将DirBogoDict它们暴露给子shell(或者只是内联它们 - 为什么首先需要它们作为变量?将命令名称放在变量中特别奇怪;只需要更新你的PATH,然后只需使用命令的名称).

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