Bash grep函数用于数组中的字符串,无法获得正确的引号

时间:2014-12-02 11:56:48

标签: arrays string bash function grep

我正在尝试创建一个函数,它将对作为参数发送的数组的字符串执行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它收到的字符串?

3 个答案:

答案 0 :(得分:2)

有意义的是你的函数接受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"

答案 1 :(得分:0)

你的代码看起来有点搞笑。 grep通常需要正则表达式和文件来查找表达式。但是,在您的示例中,grepCheck被赋予一个错误字符串to-find,并有一个日志来查找它。

你有:

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

注意引用的变化。

答案 2 :(得分:0)

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

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

但这也是一个无用的数组:

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