2012-04-29 14 views
6

Bir if/then deyimi yapmaya çalışıyorum, burada ls | grep something komutundan boş olmayan bir çıktı varsa, bazı ifadeleri yürütmek istiyorum. Kullanmam gereken sözdizimini bilmiyorum.Bash kabuğu `if` komutu bir şey döndürür `o zaman bir şey yap '

if [[ `ls | grep log ` ]]; then echo "there are files of type log"; 
+0

birlikte tüm bu koyarsanız

Neyse, o zaman aşağıdaki komutu ile bitirmek http://mywiki.wooledge.org/BashFAQ/004 ("Bir dizinin boş olup olmadığını nasıl kontrol edebilirim? Herhangi bir * .mpg dosyası veya ülke için nasıl denetlerim?" t kaç tane var? ") eldeki acil konuyla biraz alakalı. –

cevap

18

Eh, bu yakın, ama fi ile if bitirmek gerekir: Bu çeşitli varyasyonları çalıştılar.

Ayrıca, if, yalnızca bir komut çalıştırır ve komut başarılı olursa (0 durum koduyla çıkar) koşul kodunu çalıştırır; bu, grep yalnızca en az bir eşleşme bulduğunda yapar. Eğer çıktıyı kontrol etmek gerekmez Yani:

Eğer -q ("sessiz") seçeneği desteklemeyen grep eski veya olmayan GNU versiyonu ile bir sistemde iseniz
if ls | grep -q log; then echo "there are files of type log"; fi 

, sen /dev/null etmek çıkışını yönlendirerek aynı sonucu elde edebilirsiniz: bir belirtilen dosyayı bulamazsa

if ls | grep log >/dev/null; then echo "there are files of type log"; fi 

Ama ls beri de sıfırdan farklı döndürür sen D'de olduğu gibi, hiç grep olmadan aynı şeyi yapabilir .Shawley'nin cevabı:

if ls *log* >&/dev/null; then echo "there are files of type log"; fi 

Ayrıca, hatta ls olmadan, sadece kabuk kullanarak bunu yapabilirsiniz biraz wordier olsa: Sürece özellikle bash kullandığınız olarak

for f in *log*; do 
    # even if there are no matching files, the body of this loop will run once 
    # with $f set to the literal string "*log*", so make sure there's really 
    # a file there: 
    if [ -e "$f" ]; then 
    echo "there are files of type log" 
    break 
    fi 
done 

, bunu basitleştirmek için nullglob seçeneğini ayarlayabilirsiniz biraz:

shopt -s nullglob 
for f in *log*; do 
    echo "There are files of type log" 
    break 
done 
+0

Teşekkürler - bu nokta üzerinde. –

1

if yerleşik bir kabuk komutu çalıştırır ve komutun geri değerini temel blok seçer. ls, istenen dosyaları bulamazsa, grep parçasına gerek duyulmaması için ayrı bir durum kodu döndürür. yardımcı programı, aslında aritmetik işlemleri gerçekleştiren bash, IIRC'den yerleşik bir komuttur. Bourne kabuk sözdiziminden nadiren uzaklaştığım için bu kısımda yanılmış olabilirim.

if ls *log* > /dev/null 2>&1 
then 
    echo "there are files of type log" 
fi 
+0

Açıklama için teşekkürler, ancak grep kullanmaya başladım. Birkaç normal ifade kuralını filtrelemeyi ve belki de ls dışındaki diğer komutlardan çıktıları filtrelemeyi düşünüyorum. Örnek olarak ls kullanıyordum, böylece formatımı çözmemde bana daha birçok benzer komut yazmam mümkün olacaktı. Şerefe, ~) –

+1

@BillyMoon - 'ls' çıkışını grepping yerine' find' kullanmayı düşünebilirsiniz.Eğer 'ls 'işlevini kullanırsanız, o zaman tam yolunu kullanın, böylece birisinin' ls' takma adıyla şaşırmayın. –

+0

@ D.Shawley, sadece komutlara özel bir yola bağlı olmaksızın, hem takma adları hem de işlevleri atlayan '' ls 'komutunu da kullanabilirsiniz. –

2

Veya if; then; fi olmadan:

ls | grep -q log && echo 'there are files of type log' 

Hatta:

ls *log* &>/dev/null && echo 'there are files of type log' 
+0

Yani> & 'değil' &> 'demek istiyorsunuz. –

İlgili konular