Встроенный сценарий оболочки - PullRequest
32 голосов
/ 13 февраля 2011

Возможно ли выполнить сценарий оболочки в командной строке следующим образом:

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

Приведенный выше пример не работает. Я получаю только символ >, а не результат, который я пытаюсь получить, это "true"

Когда я выполняю ps -ef | grep -c "myApplication, я получаю 1 вывод. Можно ли создать результат из одной строки в скрипте? спасибо

Ответы [ 5 ]

56 голосов
/ 13 февраля 2011

Это не работает, потому что вы пропустили fi, чтобы закончить свое заявление if.

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

Вы можете сократить его, используя:

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

Также,обратите внимание на проблему совпадения ps -ef | grep ..., как указано в @ DigitalRoss 'answer .

update

Фактически, вы можете сделать это лучше, используя pgrep:

if [ $(pgrep -c "myApplication") -eq 1 ]; then echo "true"; fi
6 голосов
/ 13 февраля 2011

Да, с исправленными синтаксическими проблемами

Это почти сработало. Правильный синтаксис:

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

Но обратите внимание, что в выражении такого рода, включающем ps и grep, grep обычно совпадает сам по себе, потому что символы "grep -c Myapplication" отображаются в списке ps. Есть несколько способов обойти это, один из них - поискать что-то вроде [M]yapplication.

5 голосов
/ 14 февраля 2011

Другие ответы касались вашей синтаксической ошибки, но я настоятельно рекомендую вам изменить строку на:

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

Если вы не пытаетесь ограничить число вхождений ровно 1 (например, если выпросто пытаетесь проверить выходную строку myApplication, и вы ожидаете, что она никогда не появится более одного раза), затем просто выполните:

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

(если вам нужен набор счетчиков переменных для последующей обработки, ни одно из этих решенийбудет уместно.)

Использование коротких замыканий && и ||операторы часто намного понятнее, чем встраивание конструкций if / then, особенно в однострочные.

1 голос
/ 21 октября 2013

Я пользуюсь Mac OS, и подписка сработала очень хорошо

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

правда

Пробел необходим после [и до]

0 голосов
/ 11 октября 2011

Я изо всех сил пытался объединить подачу нескольких строк в команду и получить ее результаты в переменную (не файл) и придумал следующее решение:

    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
        )

Обратите внимание, что слово в одинарных кавычках былоподставил, потому что в противном случае я получал его автозамену на двойные кавычки ... ksh, HP-UX.

Надеюсь, это будет полезно и кому-то еще.

...