2016-06-08 51 views
0

我试图循环遍历allURLs.txt并检查该文件中的每个条目是否存在于PDFtoCheck.pdf中。我知道一个名为pdfgrep的工具,但似乎无法将其应用于我的目标。如何检查文本文件中的所有条目是否存在于pdf文件中?

#!/bin/bash 

entriesMissing=0; 

cat allURLs.txt | while read line 
do 
    # do something with $line here 
    if [ ! -z echo `pdfgrep "$line" PDFtoCheck.pdf` ]; 
then 
     echo "yay $line"; 

else 
     echo "$line not found"; 
     entriesMissing=$[$entriesMissing+1]; 
fi 

done 

echo "DONE"; 
echo "There are $entriesMissing entries missing!"; 

尽管allURLs.txt放置虚拟值,entires其存在于allURLs.txt但不是在PDFtoCheck.pdf不会反映在输出中。任何想法如何使其按预期工作?

+0

我认为你的增量并不好。尝试'((entriesMissing ++))'。 – blackSmith

+1

因为你的管道,所以它创建一个子shell,所以当你退出循环时变量会丢失。尝试搜索'变量不是设置循环bash'或类似的。 – 123

+1

@blackSmith增量很好,它只是'$(())'的不赞成使用的语法。 – 123

回答

1

请注意,当管道为cat file | while时会创建子外壳。您应该使用文件重定向:while ... do; done < file

据我所见pdfgrep支持-q安静的标志,所以你可以在if -statement中使用它。

entriesMissing=0 
while IFS= read -r line; do 
    if pdfgrep -q -- "$line" PDFtoCheck.pdf; then 
    printf "Found '%s'\n" "$line" 
    else 
    printf "'%s' not found\n" "$line" 
    ((entriesMissing++)) 
    fi 
done < allURLs.txt 

printf "There are %d entries missing\n" "%entriesMissing" 

我也改变了增量((... ++))

+0

对不起,这是行不通的......即使它们存在于PDFtoCheck.pdf中也没有找到,尽管它们存在于PDFtoCheck.pdf –

+0

@JaredAaronLoo:你有没有见过pdfgrep的工作,就像从cmd-line一样,用单词搜索目标? (最简单的情况吧?)。祝你好运。 – shellter

+0

是的,它可以在终端中使用。这就是为什么它让我困惑的是,布尔表达式总是评估为true(即使插入到allURLs.txt中的是虚拟值)。它从来没有进入else语句。 –

0

扩展为答案我的意见。我使用-c选项,也可在pdfgrep

entriesMissing=0 
while read line 
do 
    # do something with $line here 
    if [ $(grep -c "$line" b) -eq 0 ] 
    then 
     ((entriesMissing++)) 
     echo "$line not found" 
    else 
     echo "yay $line" 
    fi 
done < allURLs.txt 

echo "DONE" 
echo "There are $entriesMissing entries missing!"; 

有件事我想在你的代码,你是递增entriesMissing子shell(管)内指出它没有得到最后一行反映。希望能帮助到你。

相关问题