14

我试图找到一个包含术语“someWord”和其他两个由 $1 和 $2 表示的术语的特定进程

 7   regex="someWord.*$1.*$2"
 8   echo "$regex"
 9   [ `pgrep -f $regex` ] && return 1 || return 0

返回

./test.sh foo bar
someWord.*foo bar.*
./test.sh: line 9: [: too many arguments

我的正则表达式会怎样?直接在 shell 中执行 pgrep 可以正常工作。

4

3 回答 3

8

好先生,也许这个

[[ `pgrep -f "$regex"` ]] && return 1 || return 0

或这个

[ "`pgrep -f '$regex'`" ] && return 1 || return 0
于 2013-02-12T16:47:57.747 回答
1

首先,没有理由将您的pgrep命令包装在任何东西中。只需使用其退出状态:

pgrep -f "$regex" && return 1 || return 0.

如果pgrep成功,您将返回 1;否则,您将返回 0。但是,您所做的只是反转预期的退出代码。您可能想要做的只是让pgrep函数成为您的函数的最后一个语句;那么退出代码pgrep将是您的函数的退出代码。

something () {
   ...
   regex="someWord.*$1.*$2"
   echo "$regex"
   pgrep -f $regex
}
于 2013-02-12T16:54:41.207 回答
0

如果你真的想做一些事情以防你的命令返回错误:

cmd="pgrep -f $regex"

if ! $cmd; then
  echo "cmd failed."
else
  echo "ok."
fi
于 2013-02-12T16:57:58.473 回答