【问题标题】:Grep 2 variables with a ":" in betweengrep 2 个变量,中间有一个“:”
【发布时间】:2016-12-15 00:49:44
【问题描述】:

我目前在这段代码上停留了很长时间。下面是我的代码。

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 中,程序也会始终输出“Book found”。我想要从这个程序中读取 2 个用户输入,$bookName$authorName,并将其与数据库完全匹配(包括分号)。

任何帮助将不胜感激!

编辑:程序总是输出“Book not found”,而不是“Book found”

【问题讨论】:

  • 在某处上传您的示例文件。
  • 您好!我在这里上传了原始文本文件。 txt.do/58ofn

标签: bash shell ubuntu grep quotes


【解决方案1】:

将您的 if 语句更改为以下应该可以解决您的问题

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

正如@heemayl 所建议的,您需要在变量周围使用双引号。

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

【讨论】:

  • grep 设置退出代码。我相信你会发现把 grep inside 一个命令替换 inside 一个测试没有任何好处,这样 test 可以设置一个退出代码。
【解决方案2】:

我为自己的愚蠢错误感到非常尴尬。为了让事情更简单,我没有提供包含更多参数的原始文本文件。我意识到我的代码的问题是 grep 的 -x 参数,它只找到与整行匹配的字符串。 删除后,程序运行正常。 只有在Cyrus 发表评论后,我才意识到这可能是我原来的BookDB.txt 的问题。 谢谢大家!!

【讨论】:

    【解决方案3】:

    引用变量扩展部分:

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

    不引用扩展会受到分词(和全局扩展)的影响,只有第一个单词被视为搜索模式,其余单词与 BookDB.txt 一起被视为文件名。

    【讨论】:

    • 您好!我刚刚编辑了我的程序输出。为错误道歉。我也尝试添加双引号,但即使书和作者在数据库中,程序仍然重复输出“找不到书”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多