2009-10-08 5 views
0

J'ai ce script:Comment grep peut-il interpréter littéralement une chaîne qui contient un astérisque et qui est utilisée pour grep à travers une variable?

#!/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 & 
problème est

il ne fonctionne pas en raison de l'astérisque dans la variable CMD. comment puis-je dire à grep de voir la valeur de la variable telle qu'elle est? Toute solution? Il est obligatoire que grep soit alimenté par la variable. Merci.

Répondre

3

Puisque vous n'utilisez pas des expressions régulières, vous pouvez utiliser fgrep $CMD au lieu de grep

+0

Résolu. Merci. – Paralife

1

Le problème ne grep, il est

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

Si vous

echo $CLASSPATH 

vous devriez voir que votre shell a étendu le * à tous les fichiers dans ce répertoire. Pour y remédier, il suffit d'utiliser des guillemets simples pour éviter englobement:

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

Je pensais que aussi, mais j'ai ajouté cette déclaration d'écho avant le CMD = ... affectation et il n'est pas développé ... je ne sais pas pourquoi. De toute façon je ne peux pas faire de guillemets simples parce que réellement CLASSPATH dans mon exemple du monde réel se compose d'autres vars: CLASSPATH = "$ BASEPATH/libs/*: $ BASEPATH/morelibs/*" – Paralife

+0

Bien que peut-être je pourrais concaténer, mais il semble trop moche être la seule solution – Paralife

1

totalement sans rapport avec votre problème grep spécifique, mais jps fera rapport sur l'exécution de processus Java et peut-être rendre votre grepper plus facile puisque vous auriez très probablement juste ne:

jps | grep MainClass 

(ou quelque chose de similaire)

+0

merci. très intéressant. – Paralife

Questions connexes