2011-10-27 18 views
5

Bu benim foobar.sh için kod:Boş/boş grep ile İfade geri dönerken?

!#/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 

Temelde izlenen bir süreç bittikten sonra X komutunu çalıştıracak bir infin- tik döngü yürütüyorum ama ben şu mesajım benim script döngülerimi aldım:

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

Komut dosyası, sıfır geri beslemenin 'O halde' ifademi tetikleyeceğini ve X komutunu yürürlükte olan yöntemi beğenmediğinden kabul edeceğini kabul etmenin bir yolu var mı.

cevap

9

yerine

if [ "$pid"="" ] 

ait boşluk = önemlidir etrafında

if [ "$pid" = "" ] 

deneyin. Sıfır testi if [ -z "$pid" ]

+0

Mükemmel Çok teşekkür ederim! – bikerben

3

Ben

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

(pgrep paketi psmisc IIRC içindedir)

Sadece test ettik yapardım. Beklemenin sessiz olmasını istiyorsanız pgrep çıktısını /dev/null'a yönlendirebilirsiniz. şeyler kesintisiz hale getirmek için biraz daha baharat ekleyin:

{ 
    trap "" INT 
    while pgrep -fl "mylittleprogram" >/dev/null 
    do 
     sleep 6 
    done 
    true 
} && exit 
1

denemek da kabinli

:

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

... ve arkaik ters tırnak sözdizimi, bunu dikkate hangi işlemin tam olarak adlandırıldığı ve seçtiğiniz bir çıktı biçimi oluşturduğu (burada, varsa pid işlemi):

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

Sonra belirtildiği gibi, sadece boş bir değer için test edin: çıktı eleman adından sonra

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

eşittir işareti normalde alacağı istikameti bastırır. Man sayfaları senin arkadaşın.

0

yerine belirsiz eşleme tarafından sağlanan olduğu

if [ -z "$pid" ]