我正在为我的程序选择一个选项,它应该像这样工作:
我尝试用grep玩,但无济于事。 以下是我对此特定功能的代码。
function fnAddBook()
{
echo "Title: "
read inputTitle
echo "Author: "
read inputAuthor
if grep -Fq "$inputTitle" BookDB.txt; then
if grep -Fq "$inputAuthor" BookDB.txt; then
echo "Error!"
fi
else
echo "Price: "
read inputPrice
echo "$inputTitle:$inputAuthor:$inputPrice" >> BookDB.txt
echo "New Book successfully added!"
fi
}
BookDB.txt的内容 内容格式|标题:作者:价格:QtyAvail:QtySold
Hello World:Andre:10.50:10:5
Three Little Pig:Andrew Lim:89.10:290:189
All About Ubuntu:Ubuntu Team:76.00:55:133
Catch Me If You Can:Mary Ann:23.60:6:2
Happy Day:Mary Ann:12.99:197:101
更新的问题: 在这种情况下,即使我输入“Catch Me If You Can”作为标题+“Ubuntu Team”作为Author,它也会引发错误。如何修改代码,使其逐行检查?
提前感谢那些帮助过的人! :)
答案 0 :(得分:4)
您的代码有3个问题。
第一个是grep的x选项使它只匹配完整的行,并且因为你将作者和标题放在同一行上,所以这将不匹配。
使用x选项“Gaiman”与“Gaiman:Nation:$ 20”不匹配,如果从grep-options中删除x,这将有效。
第二个问题是两个greps是相互独立的。因此,如果你有一本名为'Nation'的书和一本'Gaiman'的书,它将被认为是一场比赛,即使你所拥有的'国家'一书是'国家的财富'和你已经获得的Gaiman书籍' Anansi Boys'。
第三个问题是grep会找到部分匹配。如果你试图输入“It”这本书,那么grep会得出它已经存在于数据库中,因为“它来自沙漠”是。
您需要一个标记值来描述标题以解决此问题。 (哨兵必须是一些在书名或作者姓名中不存在的角色)
function fnAddBook()
{
echo "Title: "
read inputTitle
echo "Author: "
read inputAuthor
if grep -Fq "$inputTitle:inputAuthor:" BookDB.txt
then
echo "Error!"
else
echo "Price: "
read inputPrice
echo "$inputTitle:$inputAuthor:$inputPrice" >> BookDB.txt
echo "New Book successfully added!"
fi
}
这假设在主题词或书名中不会出现':'。