web-dev-qa-db-fra.com

Inline si script shell

Est-il possible d'exécuter un script shell en ligne de commande comme ceci:

counter=`ps -ef | grep -c "myApplication"`; if [ $counter -eq 1 ] then; echo "true";
>

L'exemple ci-dessus ne fonctionne pas, je n'obtiens que le caractère >, pas le résultat que j'essaie d'obtenir, c'est "vrai"

Lorsque j'exécute ps -ef | grep -c "myApplication, j'obtiens une sortie. Est-il possible de créer un résultat à partir d'une seule ligne dans un script? Je vous remercie

25
London

Cela ne fonctionne pas car vous avez manqué fi pour mettre fin à votre déclaration if.

counter=`ps -ef | grep -c "myApplication"`; if [ $counter -eq 1 ]; then echo "true"; fi

Vous pouvez le raccourcir davantage en utilisant:

if [ $(ps -ef | grep -c "myApplication") -eq 1 ]; then echo "true"; fi

Notez également le problème de ps -ef | grep ... correspondant à celui mentionné dans la réponse de @DigitalRoss

mettre à jour

En fait, vous pouvez faire mieux en utilisant pgrep:

if [ $(pgrep -c "myApplication") -eq 1 ]; then echo "true"; fi
47
Shawn Chin

Oui, avec des problèmes de syntaxe corrigés

Cela presque a fonctionné. La syntaxe correcte est la suivante:

counter=`ps -ef | grep -c "myApplication"`; if [ $counter -eq 1 ]; then echo "true"; fi

Mais notez que, dans une expression de ce type impliquant ps et grep, la grep correspond généralement à elle-même car les caractères "grep -c Myapplication" apparaissent dans la liste ps Il y a plusieurs façons de contourner cela, l'une d'entre elles est de grep pour quelque chose comme [M]yapplication.

6
DigitalRoss

D'autres réponses ont résolu votre erreur de syntaxe, mais je vous suggère fortement de modifier la ligne en:

 test $ (ps -ef | grep -c monApplication) -eq 1 && echo true 

Si vous n'essayez pas de limiter le nombre d'occurrences à exactement 1 (par exemple, si vous essayez simplement de vérifier la ligne de sortie myApplication et que vous vous attendez à ce qu'elle n'apparaisse jamais plus d'une fois), faites simplement:

 ps -ef | grep monApplication>/dev/null && echo true 

(Si vous avez besoin du jeu de compteurs de variables pour un traitement ultérieur, aucune de ces solutions ne sera appropriée.)

Utilisation de && et || court-circuités opérateurs est souvent beaucoup plus clair que l’incorporation de constructions if/then, en particulier dans les doublures.

5
William Pursell

J'utilise Mac OS et j'ai très bien suivi

$ counter=`ps -ef | grep -c "myApplication"`; if [ $counter -eq 1 ]; then echo "true";fi;

vrai

Il faut de l'espace après [et avant]

1
minhas23

J'avais du mal à combiner les deux lignes multiples, alimenter la commande et obtenir ses résultats dans une variable (pas un fichier) et trouver cette solution:

    FRA_PARAM="'db_recovery_file_dest'"
    FRA=$(
    sqlplus -S "/as sysdba" <<EOF
set echo off head off feed off newpage none pages 1000 lines 1000
select value from v\$parameter where name=$FRA_PARAM;
exit;
EOF
        )

Notez que Word a été remplacé par des guillemets simples, car sinon, je recevais sa substitution automatique en guillemets doubles ... ksh, HP-UX.

Espérons que cela sera utile pour quelqu'un d'autre aussi.

0
Tagar