В то время как выписка с пустым / пустым grep возвращает? - PullRequest
5 голосов
/ 28 октября 2011

Это код для моего foobar.sh:

!#/bin/bash
while [ 1 ]
do
    pid=`ps -ef | grep "mylittleprogram" | grep -v grep | awk ' {print $2}'`
    echo $pid
    if [ "$pid"="" ]
    then
            echo "Process has ended lets get this show on the road..."
            exit
    else
            echo "Process has not ended yet"
    fi
    sleep 6
done

Я в основном выполняю бесконечный цикл, который выполнит команду X после завершения отслеживаемого процесса, но я получаю следующее сообщение какцикл моего скрипта:

./foobar.sh: line 7: [: missing `]'
Process has not ended yet

Есть ли способ заставить скрипт принять тот факт, что нулевая обратная связь вызовет мой оператор «Тогда» и выполнит команду X, так как текущий метод ему не нравится.

Ответы [ 4 ]

10 голосов
/ 28 октября 2011

Вместо

if [ "$pid"="" ]

, пожалуйста, попробуйте

if [ "$pid" = "" ]

Пробел вокруг = важен.

Вы также можете попробовать

if [ -z "$pid" ]
3 голосов
/ 28 октября 2011

Я бы сделал

while pgrep -fl "mylittleprogram"; do sleep 6; done
exit # process has ended

(pgrep находится в пакете psmisc IIRC)

Я только что проверил это.Вы можете перенаправить вывод с pgrep на /dev/null, если хотите, чтобы ожидание было тихим.Добавьте еще немного специй, чтобы сделать вещи бесперебойными:

{
     trap "" INT
     while pgrep -fl "mylittleprogram" >/dev/null
     do 
         sleep 6
     done
     true
} && exit
1 голос
/ 28 октября 2011

Нулевой тест равен if [ -z "$pid" ]

0 голосов
/ 28 октября 2011

Вместо туманного сопоставления, предоставляемого:

pid=`ps -ef | grep "mylittleprogram" | grep -v grep | awk ' {print $2}'`

... и синтаксического архаического обратного удара, рассмотрите это, которое точно соответствует базовому имени процесса и создает выходной формат по вашему выбору (здесь процессpid, если он существует):

pid=$(ps -C mylittleprogram -opid=)

Затем, как уже отмечалось, просто проверьте пустое значение:

[ -z "${pid" ] && echo "no process" || echo "I live as $pid"

Знак равенства после имени выходного элемента подавляет заголовок, который вы бынормально получается.Manpages твой друг.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...