it-swarm-ru.tech

Встроенный скрипт Shell

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

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

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

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

25
London

Это не работает, потому что вы пропустили 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

Обновление

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

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

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

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

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

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

6
DigitalRoss

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

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

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

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

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

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

5
William Pursell

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

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

правда

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

1
minhas23

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

    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
        )

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

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

0
Tagar