【问题标题】:Bash grep function for strings in array, can't get the quotation marks correct数组中字符串的bash grep函数,无法正确获取引号
【发布时间】:2014-12-02 11:56:47
【问题描述】:

我正在尝试创建一个函数,该函数将对作为参数发送的数组中的字符串执行 grep,但我无法让引号按我的意愿工作。

LOG=/tmp/log.log
function grepCheck () {
    if grep $1 ; then
    STATE="true"
    else
    STATE="false"
    fi }

possibleErrors=("string1 string1 string1" "string2 string2 string2")

for checkError in ${possibleErrors[*]}
do
grepCheck "${possibleErrors[$checkError]} $LOG"
done

输出示例:

+ LOG=/tmp/log.log
+ possibleErrors=("string1 string1 string1" "string2 string2 string2")
+ for checkError in '${possibleErrors[*]}'
+ grepCheck 'string1 string1 string1 /tmp/log.log'
+ grep string1 string1 string1 /tmp/log.log grep: string1: No such file or directory grep: string1: No such file or directory

如何让函数对接收到的字符串进行 grep?

【问题讨论】:

标签: arrays string bash function grep


【解决方案1】:

让你的函数接受与grep 相同的参数是有意义的。

LOG=/tmp/log.log
grepCheck () {
    # Edit: use "$@"; add -q option to avoid spurious output
    if grep -q "$@"; then
        STATE="true"
    else
        STATE="false"
    fi
}

possibleErrors=("string1 string1 string1" "string2 string2 string2")

for checkError in ${possibleErrors[*]}
do
    # Edit: fixed quotes; pass two quoted arguments
    grepCheck "${possibleErrors[$checkError]}" "$LOG"
done

如果您只是关心这些字符串是否匹配,那么一次性将它们全部传递给grep 会更简单。

regex=$(IFS='|'; echo "${possibleErrors[*]}")
grep -Eq "$regex" "$LOG"

【讨论】:

  • 我想你想在第二个例子中使用 egrep 和 '|' ?
  • @Bitdiot Meh,我试图解决这个问题,但你说得对,这是最简单的解决方案。
【解决方案2】:

您的代码看起来有点滑稽。 grep 通常需要一个正则表达式和一个文件来查找表达式。但是,在您的示例中,为 grepCheck 提供了一个要查找的错误字符串和一个用于查找它的日志。

这里有:

if grep $1 ; then

因为 $1 没有被引用,shell 将它扩展为 grep string1 string1 string1。所以grep想在string1和string1这两个文件中查找string1(基本上是两个文件)。

我认为您想要以下内容:

function grepCheck () {
    needle=$1
    haystack=$2
    if [[ -n $(grep "$needle" "$haystack") ]] ; then
        STATE="true"     # Error found
    else
        STATE="false"
    fi }

然后在你的调用代码中:

grepCheck "${possibleErrors[$checkError]}" $LOG

注意引用的变化。

【讨论】:

  • 这是对[[ 的无用使用。 grep 很好地告诉您它是否单独成功,并且 OP 的代码完全正确。
  • 啊,是的,谢谢你纠正我的坏习惯。让我改变它。如果你不介意的话。
  • 嘿三胞胎。我把它改回原来的。原因是,我刚刚记得,他可能不想看到 grep 的结果,而是设置标志。
  • 为此使用grep -q。看我的回答。
  • 哇,太好了。我不知道 -q 选项。谢谢。
【解决方案3】:

我相信你需要这样的东西:

... for checkError in seq 0 $((${#possibleErrors[*]} - 1)) ...

但这也是对数组的无用使用:

for error in "string1 string1 string1" "string2 string2 string2"; do grepCheck "$error" "$LOG" done

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 2020-05-16
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多