Bash şartları: ifadeler nasıl “ve” yapılır? ([! -z $ VAR ve& -e $ VAR] ise)


281

Sanırım testlerin nasıl yapılacağı konusunda net değilim. İyi çalışan bir argümanın var olduğundan emin olmak istedim [ -e $VAR ], ama aynı zamanda boş bir dizede doğru olarak değerlendirildiği ortaya çıktı; ki istemiyorum.

Onları nasıl ve birlikte yapabilirim? Yoksa istediğimi yerine getiren başka bir tek test var mı?

Yanıtlar:



70

Gönderen bashman:

[[ expression ]] - koşullu ifade ifadesinin değerlendirmesine bağlı olarak 0 veya 1 durumu döndürür.

İfadeler için seçeneklerden biri:

expression1 && expression2- Her iki true expression1ve expression2doğrudur.

Böylece andonları aşağıdaki gibi birlikte yapabilirsiniz ( -nbunun tam tersidir, -zböylece kurtulabiliriz !):

if [[ -n "$var" && -e "$var" ]] ; then
    echo "'$var' is non-empty and the file exists"
fi

Ancak, bu durumda gerekli olduğunu düşünmüyorum, -e xyzzyeğer xyzzy dosya varsa doğrudur ve oldukça kolay boş dizeleri işleyebilir. İstediğiniz buysa, aslında -zboş olmayan çeke ihtiyacınız yoktur :

pax> VAR=xyzzy
pax> if [[ -e $VAR ]] ; then echo yes ; fi
pax> VAR=/tmp
pax> if [[ -e $VAR ]] ; then echo yes ; fi
yes

Başka bir deyişle, sadece şunu kullanın:

if [[ -e "$var" ]] ; then
    echo "'$var' exists"
fi

1
Biz ile kısaltabiliriz[[ -e "$var" ]] && echo "'$var' exists"
jaypal singh

1
Evet, tek astarlıysa (örneğim olduğu gibi). Koşullu blok çok daha karmaşık olsaydı bunu yapmazdım.
paxdiablo

sadece bir - belki de uzun bir - komut olması durumunda, bu formu daha kısa olduğu için kullanmak mantıklıdır
avp

9
if [ -n "$var" -a -e "$var" ]; then
    do something ...
fi

 


10
Yana POSIXdavranışını tanımlamıyor [testlerin karmaşık setleri ile, biz kullanmaktan kaçınmalısınız -aveya -obirlikte [. Burada okudum .
19:12, jaypal singh

2
@ jaypal-singh Haklısınız, ancak konu bashetiketi var ve POSIX hakkında bahsetmiyorum, bu yüzden altında çalışan bu sürümü bashve diğer bazı modern kabukları gönderiyorum.
Slava Semushin

2
bashModern mermilerin veya diğer modern mermilerin kullanımını varsayarsanız, tavsiye etmek için daha az neden vardır -a.
chepner

Bash ile bile, bu testlerin davranış şekli tüm köşe vakalarında iyi tanımlanmamıştır. Düşünün [ "$var1" -o "$var2" ]; eğer var1=(ve var2=)sonra ne var olmadığına dair bir testtir -obirini yerine edip daha olmayan boş var1veya var2olmayan boş. Bu tür bir belirsizlik, doğru x$varalıntıya sahip modern (90'lardan sonra) testkomutlardaki deyimin tek meşru sebebidir ve bu deyimin bir ateşte ölmesi gerekir.
Charles Duffy

4

Sadece değişkeninizi belirtin:

[ -e "$VAR" ]

Bu , boş olup [ -e "" ]olmadığını değerlendirir $VAR.

Sürümünüz değerlendirildiği için çalışmıyor [ -e ]. Şimdi bu durumda, bash tek argümanın ( -e) boş olmayan bir dize olup olmadığını kontrol eder .

Manpage'den:

bağımsız değişkenlerin sayısına dayalı bir kurallar dizisi kullanarak koşullu ifadeleri test edebilir ve değerlendirebilir. ...

1 argüman

İfade, yalnızca bağımsız değişken null değilse doğrudur.

(Ayrıca, bu çözüm boşluk içeren dosya adlarıyla çalışmanın ek avantajına sahiptir)


1

Şimdi bir cevap buldum. Önerileriniz için teşekkürler!

for e in ./*.cutoff.txt; do
if grep -q -E 'COX1|Cu-oxidase' $e
then
    echo xyz >$e.match.txt
else
    echo
fi

if grep -q -E 'AMO' $e
then
    echo abc >$e.match.txt
else
    echo
fi; done

Bununla ilgili herhangi bir yorumunuz var mı? İki kez grep için yetersiz görünüyor, ama işe yarıyor ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.