【问题标题】:Shell scripting- using user input variable with wildcardShell 脚本 - 使用带有通配符的用户输入变量
【发布时间】:2014-01-12 04:43:37
【问题描述】:

我得到了这个文本文件,我需要为我的程序读取用户输入:

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

下面是我的代码的 sn-p:

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

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

如何纠正这个问题,使它只匹配单行?

如何在用户输入变量中使用通配符?

【问题讨论】:

    标签: shell variables unix wildcard


    【解决方案1】:

    您正在传递到grep,但您还指定了一个文件名参数;当它获得一个文件名时,它不会从管道中读取,所以你只是独立地获取两个 grep 的输出,而不是将一个输入到下一个。

    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
    

    【讨论】:

    • 非常感谢!如果不指明 $FILENAME,我不知道我 cn grep。赞赏(:
    • 你怎么会不知道呢?这难道不是使用管道的全部意义吗——它们被使用而不是指定文件名?
    【解决方案2】:

    您遇到的主要问题是 shell 将“glob”您的输入。您可以通过使用引号来防止这种情况。例如,考虑ls *ls "*"。所以,使用"$FILENAME"

    【讨论】:

    • 谢谢,是的,我知道 * 但我如何将它与我的用户输入变量 (${SearchTitle}) 一起使用?我尝试将 * 放在几乎所有可能的组合中,但它不起作用
    • 您要使用哪种通配符? Red*Hood 所以它将匹配 Red Riding HoodRed Bloody Hood?
    猜你喜欢
    • 1970-01-01
    • 2010-10-20
    • 2011-09-30
    • 1970-01-01
    • 2021-05-25
    • 2011-06-04
    • 2010-10-01
    • 2013-09-16
    • 2021-08-22
    相关资源
    最近更新 更多