2016-04-07 12 views
1

Bir süre döngü yapmaya çalışıyorum. Bu döngü ya "yeniden deneyin ya da çıkmak için çıkış yazın" anlamsız yazarken ya da kullanıcı adını yazdıysa bir kullanıcı işaretlemelidir.Bash döngü sırasında

echo Please enter a user name to find. 
read username 
done_fn() 
{ 
    finger $username 
    exit 0 
}  
continue_fn() 
{ 
    echo 'try again or type exit to quit' 
    read exitvar 
} 

grep $username /etc/passwd >/dev/null 
while [ $? -eq 0 ] 
do 
    done_fn 
done 

exitvar=quit 

until [ $exitvar = exit ] 
do 
    continue_fn 
    done 
while [ -u $exitvar ] 
do 
    done_fn 
done 

Bu defa var her şeydir. Ne zaman tekrar deneyin ya da çıkmak için çıkış yazın sonra bir kullanıcı adı yazdığımda, sadece tekrar yankı olacaktır. Tekrar yankılanmak yerine, kullanıcıyı parmaklamak istiyorum. Pek çok yere baktım ve cevabı bulamıyorum.

Önceden teşekkür ederiz.

+0

Aldığınız çıkışı paylaşabilir misiniz? Yanlış davranış göstermek için? –

+1

Kabuk debug/trace özelliğini kullanmayı öğrenin ve set -vx' ve set + vx' ile kapanmak için problemli hatları çevirin. Kodunuzun görüntülendiğini görür ve ardından yürütülür. Önde + bulunan çizgiler, değişken adları için hangi değerlerin değiştirildiğini gösterir. Hata ayıklama modunda, tüm alıntılar, hata ayıklama/izleme işlevi tarafından tek tırnaklıya "kaynatılır". Sorunun ne olduğunu "grep" ile ve ardından "while" ile görmelisiniz. İyi şanslar! – shellter

+0

Bir kez çalıştırdıktan ve doğru bir kullanıcı yazdıktan sonra, kullanıcıyı parmaklar. Eğer anlamsız yazıyorsam, 'tekrar dene veya çıkış yapmak için çıkış' yazıyor ve bir kez doğru bir kullanıcıya koymaya çalıştığımda 'tekrar dene' ya da çıkmak için çıkış yazıyor. username_loop.sh Lütfen bulmak için kullanıcı adı giriniz. jmalley2 Giriş: jmalley2 Adı: Joseph Malley username_loop.sh Lütfen Bulmak için kullanıcı adı giriniz. asdfasdfasfasf tekrar deneyin ya exit –

cevap

1

Bu deneyebilirsiniz:

typeset u="John Doe" 
while ! grep -q "^$u:" /etc/passwd 
do 
    echo -n "username? " 
    read u 
    if [[ $u = "q" ]] 
    then 
      exit 
    fi 
done 
finger $u 
+0

Kesinlikle/etc/passwd'de bulamayacağınız bir adla başlıyorsunuz. Daha sonra/etc/passwd (^ :) 'nin ilk alanına girilen ismi bulana kadar yeni isimler sormaya devam edersiniz. Sonunda bir isim bulursanız, sadece parmakla. – Dandorid

+0

"read" öğesini "while" içine koyabilirsiniz, böylece bir sentinel değeriyle başlamak zorunda kalmazsınız. Ayrıca sanırım parmak parmağın içine girmeli. – tripleee

+0

Döngü geçerli bir kullanıcı adı bulmak için kullanılır, başka bir şey değil. Eğer kullanıcı adı 'q' ise, o zaman tamamen çıkın. Geçerli bir kullanıcı adı bulunursa, son 'parmak' ifadesini yürütün ve sonra komut dosyasını sonlandırın. “Read” zaten “while” durumundadır ve parmak shoud orda olmamalıdır, çünkü orjinal istekte yoktur. – Dandorid

0
echo Please enter a user name to find. 
read username 
donev2_fn() 
{ 
     finger $exitvar 
     exit 0 
} 
done_fn() 
{ 
     finger $username 
     exit 0 
} 
continue_fn() 
{ 
     echo 'try again or type exit to quit' 
     read exitvar 
     grep $exitvar /etc/passwd >/dev/null 
     if [ $? -eq 0 ] 
       then 
         donev2_fn 
     fi 
} 
grep $username /etc/passwd >/dev/null 
while [ $? -eq 0 ] 
     do 
       done_fn 
done 
exitvar=quit 
until [ $exitvar = exit ] 
     do 
       continue_fn 
done 

ben bunu anladım. İçinde ekstra bir işlev koymak zorunda kaldım. Tüm yardımlarınız için teşekkür ederim.