2013-07-22 3 views
1

Я пытаюсь написать цикл for с grep. Когда grep возвращает значение, я хочу отобразить сообщение «running». Если значение не возвращается, отобразите «доступно».Использование grep в цикле for

Я думаю, что что-то не так с моим утверждением if, но я ничего не могу найти.

Любые предложения были бы весьма полезными.

#!/bin/sh 
    #JWR1.0, REL1.10 

    echo "Content-type: text/html" 
    echo "" 

    chk_port = 'ps -ef | grep "port $i -"' 

    for ((i=1; i<=5; i++)) 
    do 
      if [[ $chk_port ]]; then 
        echo "Running - $i<br>" 
      else 
        echo "Available - $i<br>" 
      fi 
    done 

    echo "<br>" 

    # For debugging 


    ps -ef | grep "port 1 -" 

Пример вывода:

Available - 1 
    Available - 2 
    Available - 3 
    Available - 4 
    Available - 5 

    apache 7706 7700 0 15:07 ? 00:00:00 grep port 1 - 
+0

Попробуйте заменить $ chk_port на это: $ (ps -ef | grep "port $ i -") –

+0

Спасибо, Эд, это сработало для меня! – Jeremy

+0

@ed .: Это делает 'for'-loop довольно бессмысленным, так как он просто проверяет пять раз, чтобы узнать, был ли процесс изначально запущен. , , – ruakh

ответ

1

Я думаю, ваша проблема, есть нетport $i на выходе вашего PS, но ваш скрипт считает, что существует.

Проблема заключается в том, что команда grep port $i - также находится в выводе ps -ef, это было ясно в вашем отладочном выходе. Вы можете проверить это с ps -ef|grep foo

Чтобы избежать этого, есть трюк, просто сделать

chk_port=$(ps -ef | grep "[p]ort $i -") 

, например:

kent$ ps -ef|grep nothing 
kent  10226 4752 0 00:36 pts/2 00:00:00 grep --color=auto nothing 

kent$ ps -ef|grep [n]othing 
zsh: no matches found: [n]othing 

Также вы можете проверить код возврата Grep (Grep - q) решить, найден ли шаблон. Если совпадений не найдено, grep возвращает 1, иначе 0.

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