代码之家  ›  专栏  ›  技术社区  ›  Paralife

grep如何从字面上解释包含星号并通过变量馈送给grep的字符串?

  •  1
  • Paralife  · 技术社区  · 15 年前

    我有这个剧本:

    #!/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 回复  |  直到 15 年前
        1
  •  4
  •   heijp06    15 年前

    因为您不使用正则表达式,所以可以使用 fgrep $CMD 而不是 grep

        2
  •  1
  •   csl    15 年前

    问题不是很严重,而是

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

    如果你这样做了

    echo $CLASSPATH
    

    您应该看到shell已经将*扩展到该目录中的所有文件。要解决此问题,只需使用单引号即可防止全局搜索:

    CLASSPATH='/blah/libs/*:/blah/more/libs'
    
        3
  •  1
  •   Brian Agnew    15 年前

    与你的GREP问题完全无关,但是 jps 将报告运行Java进程,并可能使您的贪婪更容易,因为您很可能不得不这样做:

    jps | grep MainClass
    

    (或类似的东西)