2016-08-09 31 views
1

我目前很长时间停留在这段代码现在。以下是我的代码。grep 2变量与“:”之间的

if grep -ixqF $bookName:$authorName BookDB.txt 
then echo "Book found" 
else 
echo "Book not found" 

BookDB基本上包含书名和作者信息,如下所示,其中语法为“书名:作者”。

Mary had a little nose:JamesPoppcock Merry Christmas:Christ Sake Kinky Asians:Walter Bedding

然而,程序总是输出“书发现”,即使这本书和作者是不是在BookDB.txt。我希望从这个程序中读取2个用户输入,即$bookName$authorName,并将其准确地(包括分号)与数据库匹配。

任何帮助将不胜感激!

编辑:该程序总是输出“书未找到”,而不是“书发现”

+0

将您的示例文件上传到某个地方。 – Cyrus

+0

你好!我在这里上传了原始文本文件。 http://txt.do/58ofn – JamesPoppycock

回答

1

引用的变量扩展部分:

grep -ixqF "$bookName:$authorName" BookDB.txt 

在不引用膨胀被从字分离患(和glob扩展),并且只有第一个单词被用作搜索的模式,其余的被视为文件名以及BookDB.txt

+0

你好!我刚刚编辑了我的节目输出。抱歉的错误。我也尝试添加双引号,但即使书和作者在数据库中,该程序仍然会重复输出“Book not found”。 – JamesPoppycock

0

我对自己愚蠢的错误感到非常尴尬。为了简单起见,我没有放置包含3个参数的原始文本文件。我意识到我的代码的问题是grep的-x参数,它只找到匹配整行的字符串。 删除它后,程序工作正常。 只有在Cyrus评论后我才意识到这可能是我原来BookDB.txt的问题。 谢谢大家!

-1

更改your're if语句下面应该解决您的问题

if [ "$(grep -ixF "$bookName:$authorName" BookDB.txt)" != "" ]

正如@heemayl建议,你需要用双引号周围的变量。

另外,不是使用grep的-q选项,而是简单地将输出与!= ""进行比较。

+1

'grep'设置退出代码。我相信你会发现将grep _inside_ a命令替换为_inside_ test是没有好处的,这样test可以设置退出代码。 – John1024