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
需要充满活力。
答案 0 :(得分:1)
要存储命令供以后使用,您需要使用函数。
这是一个执行两个特定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
命令,正则表达式可以很强大...)但是你可以设想一个过滤不包含前缀参数的行的函数由!
和所有其他人。
答案 1 :(得分:-1)
我相信发生了很多错误,因为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
的内容,那么就可以成为一个不错的黑客。