оператор "if" всегда оценивает к TRUE

Помогло бы, могли ли Вы описать грамматику, Вы в настоящее время используете для синтаксического анализа. Кажется, что проблема могла бы заключаться там!

Редактирование:

то, что Вы не понимаете вопроса о грамматике и что 'Вы записали, это вручную' очень вероятно объясняет, почему у Вас есть проблемы с выражениями формы '1+11*5' (т.е. с приоритетом оператора). Гугление для 'грамматики для арифметических выражений', например, должно привести к некоторым хорошим указателям. Такая грамматика не должна быть сложной:

 ::=  +  |
           -  |
          

 ::=  *  |
            /  |
           

 ::= x | y | ... |
             (  ) |
             -  |
             

добился бы цели, например, и может быть тривиально увеличен для заботы о некоторых более сложных выражениях (включая функции, например, или полномочия...).

я предлагаю, чтобы Вы взглянули на этот поток, например.

Почти все введения в грамматики/парсинг рассматривают арифметические выражения как пример.

Примечание, что использование грамматики нисколько не подразумевает использование определенного инструмента ( а-ля Yacc, Бизон...). Действительно, Вы несомненно уже используете следующую грамматику:

  ::  |   

   :: + | - | * | /

 ::  | ()

(или что-то вроде вида), не зная это!

7
задан doubleDown 16 October 2012 в 20:13
поделиться

4 ответа

Попробуйте вместо этого:

ps aux | grep -q "[p]rocessName"
if [ $? -eq 0 ]; then
    echo "running"
else
    echo "not running"
fi

Скобки вокруг первой буквы processName означают, что «grep -v grep» не нужен, а -q означает, что нам не нужен по каналу к / dev / null

$? дает вам код возврата предыдущей выполненной команды. Следовательно, проверка, был ли он равен 0, будет указывать на то, что "grep" нашел то, что искал.

Обновление

Если имя вашего процесса действительно короткое (скажем, "чашка"), вы можете получить ложное срабатывание, поскольку оно может сопоставьте также другие процессы (скажем, "cupsd"). Вы можете преодолеть это, задав для поиска целые слова с помощью grep - добавьте флаг «-w».

Не то чтобы этот метод не идеален. Вы можете закончить совпадение записей в полях имени пользователя / даты. Если это произойдет, найдите «man ps» и более избирательно подходите к тому, что вы распечатываете, прежде чем выполнять команду grep. В качестве альтернативы, предварительно отфильтруйте вывод с помощью awk, чтобы извлечь только столбец, показывающий имя процесса / cmd. Например:

ps aux | awk '{print $11}' | grep -q -w "[p]rocessName"
if [ $? -eq 0 ]; then
    echo "running"
else
    echo "not running"
fi

Обновление 2

, вы также можете использовать pgrep, как предлагается в ответе ниже.

Для очень коротких имен процессов вы можете указать границы слов (\ b) до и после имени вашего процесса, чтобы предотвратить избыточное соответствие (как описано выше)

pgrep "\bprocname\b" > /dev/null
if [ $? -eq 0 ]; then
    echo "running"
else
    echo "not running"
fi

Обновление 3

Из обновленного вопроса я вижу, что вы запускаете его из сценария инициализации. Всегда есть опасность, что pgrep будет соответствовать самому скрипту. Попробуйте:

pgrep Processname | grep -q -v $$
if [ $? -eq 0 ]; then
    echo "running"
else
    echo "not running"
fi

Это исключает PID скрипта из совпадений pgrep.

Обновление 4

(последнее обновление? Скрещенные пальцы)

Если скрипт инициализации запускается с помощью команды "service", тогда нам нужно чтобы также отфильтровать родительский PID. Как насчет:

pgrep Processname | grep -v $$ | grep -q -v $PPID
if [ $? -eq 0 ]; then
    echo "running"
else
    echo "not running"
fi
16
ответ дан 6 December 2019 в 10:51
поделиться

Вероятно, потому что grep "processName" обнаруживает себя. Вчера я обнаружил ту же самую проблему, за исключением того, что я xarg выдавал результаты на kill ...

В качестве альтернативы вы можете попробовать pgrep ] вместо вашей строки ps и различных grep s:

sd@camel:~$ pgrep bash
415
3477
sd@camel:~$ echo $?
0
sd@camel:~$ pgrep arf
sd@camel:~$ echo $?
1
2
ответ дан 6 December 2019 в 10:51
поделиться

Добрый день,

В стороне, вместо

ps ax | grep -v grep | grep "processName"

Попробуйте выполнить

ps ax | grep "[p]rocessName"

ps перечисляет функцию grep, потому что она видит строку "grep processName" в список процессов, который передается вашей grep для строки «processName».

Grepping для «[p] rocessName» будет соответствовать только «processName» сам по себе, но не строке «grep [p] rocessName».

1
ответ дан 6 December 2019 в 10:51
поделиться

вы не проводите тест. заключите условие теста в скобки, например:

if [условие вашего тестирования]

-1
ответ дан 6 December 2019 в 10:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: