it-swarm.com.de

Inline wenn Shell-Skript

Ist es möglich, ein Shell-Skript in der Befehlszeile wie folgt auszuführen:

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

Obiges Beispiel funktioniert nicht Ich bekomme nur > Zeichen nicht das Ergebnis das ich versuche zu bekommen, das ist "true"

Beim Ausführen von ps -ef | grep -c "myApplication erhalte ich 1 Ausgabe. Ist es möglich, das Ergebnis aus einer einzelnen Zeile in einem Skript zu erstellen? Danke dir

25
London

Es funktioniert nicht, weil Sie fi verpasst haben, um Ihre if-Anweisung zu beenden.

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

Sie können es weiter verkürzen mit:

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

Beachten Sie auch die Ausgabe von ps -ef | grep ..., die sich selbst in der Antwort von @DigitalRoss - befindet. 

aktualisieren

Tatsächlich können Sie mit pgrep eine bessere Leistung erzielen:

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

Ja, Syntaxprobleme behoben

Das fast hat funktioniert. Die korrekte Syntax lautet:

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

Beachten Sie jedoch, dass in einem Ausdruck dieser Art, der ps und grep umfasst, die grep normalerweise auf sich selbst abgestimmt ist, da die Zeichen "grep -c Myapplication" in der Liste ps angezeigt werden. Es gibt mehrere Möglichkeiten, eine davon ist für so etwas wie [M]yapplication.

6
DigitalRoss

Bei anderen Antworten wurde der Syntaxfehler behoben. Ich würde jedoch dringend empfehlen, die Zeile folgendermaßen zu ändern:

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

Wenn Sie nicht versuchen, die Anzahl der Vorkommen auf genau 1 zu begrenzen (wenn Sie z. B. lediglich nach der Ausgabezeile myApplication suchen und Sie erwarten, dass sie niemals mehr als einmal erscheint), tun Sie einfach Folgendes:

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

(Wenn Sie den variablen Zähler für die spätere Verarbeitung festlegen müssen, ist keine dieser Lösungen geeignet.)

Verwenden Sie kurzgeschlossen && und || Operatoren sind oft viel klarer als das Einbetten von if/then-Konstrukten, insbesondere in Einzeilen.

5
William Pursell

Ich benutze Mac OS und das Follow-up hat sehr gut funktioniert

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

wahr

Platz wird nach [und vor] benötigt

1
minhas23

Ich hatte Mühe, die beiden Zeilen mit mehreren Zeilen zu kombinieren und die Ergebnisse in eine Variable (keine Datei) zu bringen. Dabei kam ich zu dieser Lösung:

    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
        )

Bitte beachten Sie, dass Word durch einfache Anführungszeichen ersetzt wurde, da ich ansonsten die Autosubstitution zu doppelten Anführungszeichen erhielt ... ksh, HP-UX.

Hoffentlich wird dies auch für andere hilfreich sein.

0
Tagar