2015-08-23 3 views
0

Это мой кодUnix, используя Grep с, если

if [[ (grep -x $idle | grep -x $dead | grep -x $busy) || grep -x $idle1 | grep -x $dead | grep -x $busy1 ]] ./Event.log 
then 
    echo "Events are running Successfully" >> ./Event.log 
else 
    echo "One or more Events are down. Check the log and restart the Events." >> ./Event.log 
fi 

Я получаю ошибку

0403-057 Syntax error at line 14 : `-x' is not expected. 

Что это?

+0

Вы хотите, чтобы 'grep -x $ idle' собирался читать из../Event.log'? Что вы хотите прочитать с помощью команды grep -x $ idle1? –

+2

Можете ли вы объяснить, что вы пытаетесь сделать? Я не могу догадаться; разные части кода не подходят друг другу, что имеет смысл для меня. – ruakh

+0

Если '$ idle' и' $ dead' содержат точные строки, 'grep -x $ idle | grep -x $ dead' никогда не вернет совпадение. – tripleee

ответ

5

В bash, [[ синтаксически команду , которая заканчивается соответствующими ]]. Он не является частью синтаксиса if команды, синтаксис которого начинается:

 if commands ; then 

Если вы хотите проверить, удалось ли команда или нет, вы просто сделать:

if grep -q pattern file; then 
    # grep found pattern in file 
else 
    # grep did not find pattern in file 
fi 

В пределах [[ команда, bash ожидает найти условное выражение, не другая команда. Вот почему grep -x ... является синтаксической ошибкой. -x - унарный оператор в условном выражении, который является истинным, если его аргумент является именем исполняемого файла, но в этом выражении он используется, как если бы он был двоичным оператором.

Если вы хотите протестировать более одного образца с помощью grep, вы можете использовать опцию -e, чтобы указать каждый вариант; Grep удастся (или выбрать) строки, соответствующие любой из вариантов:

if grep -q -e pattern1 -e pattern2 file; then 
    # grep found pattern1 or pattern2 in file 
else 
    # grep did not find either pattern in file 
fi 
0

длинный выстрел, я предполагаю, что вы хотите Event.log содержать один каждый из обоих членов пары. Это можно сделать примерно с

if awk "/^($idle|$idle1)$/ { ++idle; next } 
     /^($dead|$dead1)$/ { ++dead; next } 
     /^($busy|$busy1)$/ { ++busy; next } 
     idle && dead && busy { exit 0 } 
     END { exit 1 }' Event.log; then 
    echo Yes 
else 
    echo no 
fi 

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

Имеет смысл напечатать результат также от Awk, но в этом ответе уже есть множество предположений и догадок.

Смежные вопросы