Shell脚本 - 使用带有通配符的用户输入变量

时间:2014-01-12 04:43:37

标签: shell variables unix wildcard

我收到了这个文本文件,我需要通过用户输入读入我的程序:

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”,并且应该能够列出输出。

然而,这样做的时候......小红帽和哈利波特死亡空洞出现了。

如何纠正此问题,使其仅匹配单行?

如何将通配符与用户输入变量一起使用?

2 个答案:

答案 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"