Inline, если оболочка script
Возможно ли выполнить команду shell script в командной строке следующим образом:
counter=`ps -ef | grep -c "myApplication"`; if [ $counter -eq 1 ] then; echo "true";
>
Вышеприведенный пример не работает. Я получаю только символ >
не результат, который я пытаюсь получить, то есть "true"
Когда я выполняю ps -ef | grep -c "myApplication
, я получаю 1 вывод. Можно ли создать результат из одной строки в script? спасибо
Ответы
Ответ 1
Это не работает, потому что вы пропустили 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.
Обновление
На самом деле вы можете сделать это лучше, используя pgrep
:
if [ $(pgrep -c "myApplication") -eq 1 ]; then echo "true"; fi
Ответ 2
Да, при проблемах с синтаксисом исправлено
Это почти сработало. Правильный синтаксис:
counter=`ps -ef | grep -c "myApplication"`; if [ $counter -eq 1 ]; then echo "true"; fi
Но обратите внимание, что в выражении этого типа, включающем ps
и grep
, grep
обычно будет соответствовать самому себе, потому что в списке ps отображаются символы grep -c Myapplication. Есть несколько способов обойти это, один из них - grep для чего-то вроде [M]yapplication
.
Ответ 3
Другие ответы затронули вашу синтаксическую ошибку, но я настоятельно рекомендую вам изменить строку на:
test $(ps -ef | grep -c myApplication) -eq 1 && echo true
Если вы не пытаетесь ограничить число вхождений ровно 1 (например, если вы просто пытаетесь проверить выходную строку myApplication и вы ожидаете, что она никогда не появится более одного раза), тогда просто выполните:
ps -ef | grep myApplication > /dev/null && echo true
(Если вам нужен счетчик переменных для последующей обработки, ни одно из этих решений не будет подходящим.)
Использование короткого замыкания && и || операторы часто гораздо яснее, чем вложение, если/затем конструкции, особенно в однострочных.
Ответ 4
Я пытался объединить как несколько строк в команду, так и получить его результаты в переменной (а не в файле) и придумать это решение:
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.
Надеюсь, это будет полезно и для кого-то еще.
Ответ 5
Я использую Mac OS, а после работы очень хорошо
$ counter=`ps -ef | grep -c "myApplication"`; if [ $counter -eq 1 ]; then echo "true";fi;
True
Пространство необходимо после [и до]