我收到了这个文本文件,我需要通过用户输入读入我的程序:
Harry Potter - The Half Blood Prince:J.K Rowling
The little Red Riding Hood:Dan Lin
Harry Potter - The Phoniex:J.K Rowling
Harry Potter - The Deathly Hollow:Dan Lin
以下是我的代码片段:
#search with both field entered
elif [ -n "${SearchTitle}" ] && [ -n "${SearchAuthor}" ]; then
echo "Found ` grep -icw "${SearchTitle}" $FILENAME | grep -icw "${SearchAuthor}" $FILENAME ` record(s) :"
cat $FILENAME | grep -iw "${SearchTitle}" $FILENAME | grep -iw "${SearchAuthor}" $FILENAME | awk -F':' '{ printf "%-1s, %-1s, $%-1s, %-1s, %s\n", $1, $2, $3, $4, $5 }'
fi
用户将输入标题&作者在提示时会看到找到多少份副本并列出整行。
用户只能输入“harry”和“Dan”,并且应该能够列出输出。
然而,这样做的时候......小红帽和哈利波特死亡空洞出现了。
如何纠正此问题,使其仅匹配单行?
如何将通配符与用户输入变量一起使用?
答案 0 :(得分:3)
你正在管道grep
,但你也指定了一个文件名参数;当它获得文件名时,它不会从管道中读取,所以你只是单独获取两个greps的输出而不是将它们输入到下一个。
elif [ -n "${SearchTitle}" ] && [ -n "${SearchAuthor}" ]; then
echo "Found ` grep -iw "${SearchTitle}" "$FILENAME" | grep -icw "${SearchAuthor}" ` record(s) :"
grep -iw "${SearchTitle}" "$FILENAME" | grep -iw "${SearchAuthor}" | awk -F':' '{ printf "%-1s, %-1s, $%-1s, %-1s, %s\n", $1, $2, $3, $4, $5 }'
fi
答案 1 :(得分:0)
你遇到的主要问题是shell会“输入”你的输入。您可以使用引号来阻止它。例如,请考虑ls *
和ls "*"
。因此,请使用"$FILENAME"