FILTER="grep -w PROD | grep -v PROD_OPL"
if (/usr/ucb/ps auxww | grep $1/$2 | $FILTER > /dev/null)
then
#do something
fi
给出输出:
grep: can't open |
grep: can't open grep
grep: can't open -v
grep: can't open PROD_OPL
grep: can't open |
grep: can't open grep
grep: can't open -v
grep: can't open PROD_OPL
我该如何解决?$FILTER
需要动态。
存储命令以供以后使用,您将需要使用函数。
这是一个基本示例,它将执行您的两个特定grep
命令:
function filter() {
grep -w PROD | grep -v PROD_OPL
}
if (/usr/ucb/ps auxww | grep $1/$2 | filter > /dev/null)
then
#do something
fi
grep $1/$2
的输出将其输入到函数的输入,该输入将其传递到管道,其输出传递到函数的输出。
该函数的返回代码被隐式留作其最后一个命令之一,因此if
条件只有在过滤器匹配某些行时才是正确的。
就动态性而言,可以在任何时候重新定义该功能,因此您可以根据需要重新定义过滤器。一个更好的解决方案可能是对该函数进行参数化,以便根据需要实现所需的过滤器。
我需要更多的输入来提供足够的功能(甚至是足够的grep
命令,REGEX可以很强大...(,但是您可以想象一个函数过滤线包含包含!
和所有参数的任何一个和所有参数其他。
我相信发生了许多错误,因为Bash无法将|
解释为管道,因为它只是FILTER
内部的一个字符。因此,您需要实际评估$FILTER
作为表达式。例如,尝试
FILTER="grep -w PROD | grep -v PROD_OPL"
if /usr/ucb/ps auxww | grep $1/$2 | eval "$FILTER" > /dev/null
then
#do something
fi
编辑
在各种评论中清楚地说明:这最可能不是您应解决问题的方式。执行字符串作为代码很糟糕,可能是危险的设计。也就是说,如果您完全控制了FILTER
的内容,那么它 can 是一个不错的hack。