grep如何解释一个包含星号的字符串并通过变量提供给grep?

时间:2009-10-08 11:04:24

标签: bash grep

我有这个脚本:

#!/bin/bash
CLASSPATH="/blah/libs/*:/blah/more/libs"
CMD="java -cp $CLASSPATH MainClass"
ALREADY_RUNNING_PID=`ps -ef --no-headers | grep $CMD | grep -v grep | awk '{print $2}'`
if [ "$ALREADY_RUNNING_PID" ]; then
      echo "Already running"
      exit 1
fi
$CMD &

问题是由于CMD变量中的星号,它不起作用。我怎么能告诉grep看到变量值呢?有解决方案吗grep必须通过变量输入。 感谢。

3 个答案:

答案 0 :(得分:4)

由于您没有使用正则表达式,因此可以使用fgrep $CMD代替grep

答案 1 :(得分:1)

问题不是grep,而是

CLASSPATH="/blah/libs/*:/blah/more/libs"

如果你这样做

echo $CLASSPATH

你应该看到你的shell已经将*扩展到该目录中的所有文件。要解决这个问题,只需使用单引号来防止通配:

CLASSPATH='/blah/libs/*:/blah/more/libs'

答案 2 :(得分:1)

与您的特定grep问题完全无关,但jps将报告正在运行的Java进程并可能使您的grepping更容易,因为您很可能只需执行此操作:

jps | grep MainClass

(或类似的东西)