我正在开发一个选项,如果用户输入确切的标题和作者,该选项将能够删除指定的行。
然而,我无法使其发挥作用。
我的功能内容如下所示
fnRemoveBook()
{
echo"Title: "
read Title
echo"Author: "
read Author
if grep -Fqe "$Title:$Author" BookDB.txt; then
sed -i '/"$Title:$Author"/ d' BookDB.txt
echo "Book removed successfully!"
else
echo "Error! Book does not exist!"
fi
}
BookDB内容如下所示
Hello World:Andreas:10:5:2
Teaching:Mary Ann:50:23:5
在我为作者键入“Hello World”和为作者键入“Andreas”之后,该程序将能够进入循环并成功删除echo-ed Book。
但是我检查了BookDB.txt这条线还没有被删除,我想知道为什么。
我希望我能在这里得到一些答案,因为我一直在网上做研究,但目前仍然没有答案。
提前感谢那些帮助过的人! :)
答案 0 :(得分:2)
你试图将一个bash
变量(实际上是两个)传递给一个子程序(sed
),但是围绕你用单引号传递的表达式,这样做没有参数扩展。这意味着sed
确实会看到$Title:$Author
。尝试将整个sed
表达式放在双引号中:
sed -i "/$Title:$Author/d" BookDB.txt
这将允许bash
在$Title
进入之前展开$Author
和sed
。
答案 1 :(得分:1)
使用单引号不会插入变量。试试这样的事情 -
fnRemoveBook()
{
echo "Title: "
read Title
echo "Author: "
read Author
if grep -Fqe "$Title:$Author" BookDB.txt; then
sed -i "/$Title:$Author/ d" BookDB.txt # <---- Changes made here
echo "Book removed successfully!"
else
echo "Error! Book does not exist!"
fi
}