'&&' ve ';' arasında bir fark var mı? standart bir BASH terminalindeki semboller?


56

Her ikisinin de sembolleri takip eden başka bir komutla başlayabilmesi için BASH'a işaret ettiği görülüyor, ancak belirgin bir fark var mı?

Yanıtlar:


75

Bu çizgiyle:

command1 && command2

command2 eğer (ve sadece ise) command1 çıkış durumunu sıfır döndürürse çalıştırılacak, oysa bu satırda:

command1 ; command2

hem komut1 hem de komut2 bağımsız olarak yürütülür. Noktalı virgül, bir satıra birçok komut yazmanıza izin verir.


1
İlginç! Daha rahat bir yol olabileceğini düşünmüştüm. Teşekkür ederim!

42

Farkı kendiniz deneyebilirsiniz:

  1. ls /invalid/path && echo "hello!"
    / invalid / path bulunmadığından, size dizin listesini gösteremiyorum. Bir hata mesajı ile başarısız olur: "ls: / invalid / path: Böyle bir dosya veya dizin yok". İkinci yarı komutunun ( "Merhaba!" Echo) olduğu bile idam asla ilk yarı başarısız olduğu için.

  2. ls /invalid/path ; echo "hello!"
    Aynı hata mesajı eskisi gibi görünür, fakat bu sefer ikinci bölüm yürütülür !
    ls: / invalid / path: Böyle bir dosya veya dizin yok
    merhaba!

Bu neden faydalıdır? Bu komutu
archive.tar.gz adlı bir dosyayı çıkartmak istediğinizi varsayalım . Herhangi bir nedenden dolayı arşivin çıkarılması başarısız olursa, ikinci bölüm yürütülmez! Tekrar deneyebilirsin.
tar zxvf archive.tar.gz && rm archive.tar.gz

Eğer kullanırsan ; Aynı durumda, arşiv silinir ve tekrar deneyemezsiniz.


8

&&olan ANDilk tek gerçek (hata) iade ise ikinci komut sadece çalıştırır yani.


1
&& "sonra" dır (değil "ve") ... cevabımı gör
Peter.O

2
@ Fred kısa devre değerlendirmesi olan bir "ve" diyebilirim - ilk kısım doğru değilse, toplam sonucun yanlış olması gerektiğini bilir, bu yüzden ikinci kısmı atlar. Ancak bunu “o zaman” olarak düşünmenin bu bağlamda çok fazla fark yaratmayacağını kabul edin.
jg-faustus,

2
@ Fred Kavramsal olarak bu şekilde anlamak daha kolay olsa da, ifadenize katılmıyorum. Buradaki fikir, herhangi bir AND uygulamada, birincisi eşittir falseve bu nedenle temel kodun, birincisinin ne olduğunu öğrenene kadar 2. parametrenin değerlendirmesini ertelemek için optimize edilmesi durumunda, 2. parametrenin alakasız hale gelmesidir .
Ward Muylaert

2
@fred Bu örneğin ne yapmaya çalıştığından emin değilim. &&sadece bir ikili operatör, bir fonksiyondur. Tek "özel" şey, ek gösterimde (ki bu tür operatörlerin çoğunda standart olan) ve ikinci işlemcinin geciktirilmiş işleyişidir. Yani gecikmiş yürütme gerçekten o kavramsal bir şekilde görülebilir bir şey olarak kullanılmak üzere yeteneği sağlar ifaçıklamada bu bağlamda , ama bu aslen kullanımını niyetiyle aslında uzakta almaz içinde gerçek bir koşullu ifdeyimi. Burada kullanımı gerçekten bir "kesmek" dir.
Ward Muylaert

3
@fred Elbette bu üçlü bir operatör değil, sadece iki işlemin devamı a && b || c = (a && b) || c. Basit değerlendirme sırası. Orada gerçekten gizem yok. Onları tipik işlevleriniz gibi yazarsanız, basitçe benzeyecektir or(and(a, b), c). Bu mantık bir dahilinde aynıdır ifçünkü düz komut satırında içine girerken hem de şartlı &&ve ||olan operatörler iki işlenen alır ve onlar başka dönmek.
Ward Muylaert

8

Güncelleme : Bazı olası tuzakları vurgulamak için komut dosyası olarak ekledim:

Kimse "||" den bahsetmediğinden, ben söyleyeceğim

Güncelleme2 : bazı önemli ifadeler burada tekrar ifade edilir ve
& quot ; "doğru" ya yanıt veren "if" ifadesinin "sonra" sına benzer

|| olduğu DEĞİL bir "eğer" statment .. "else" gibi
|| "yanlış" ifadesine "if" ifadesinin "if" ifadesi gibidir

Daha spesifik olarak, && $ test eder? önceki en son yürütülen ifadenin döndürdüğü değer ve && ... komutunu izleyen ifadeyi hemen ifadeye veya alt kabuğa iletir. doğru.

|| benzerdir ve genellikle bir && ifadesinin ardından görülür, ancak önceki en son yürütülen ifadeden yanlış bir dönüş değeri ($?) test eder ... NB! , Nota Bene! Dikkatli olun! .... eğer önceden belirlenmiş ifade doğru olmasını beklediğinizde yanlış çıkarılan bir && ifadesiyse, || false cevap verecek, bu yüzden aynı çizgide ikisinin de karıştırılması riskli olabilir

Yapmaya çalıştığım asıl nokta, yaptığım bir hata ile ilgili. yani:
## [[koşul]] && A || B
edilir değil bir C / C ++ tarzı üçlü gibi davranmaz. yani:
// (durum)? A: B
"A" den "beklenmeyen" sonuç örnekleri için aşağıdaki betiğe bakın

Temel test ve && ve || deyimin hepsi aynı satırda olmalı ...


&& ve || En son çalıştırılan deyimi beklediğiniz biri olmayabilir ..

[[condition]] && echo Merhaba || yankı Güle güle .... tipik olarak güvenli,
çünkü iyi biçimlendirilmiş bir yankı gerçek olacak.
ama çıkmayan bir dosyaya erişmeye ne dersiniz?

#!/bin/bash
#
# "as expected" return codes" means: expected to behave like a normal AND / OR  contition test
#
if [[ "$1" != "" ]] ; then exit $1; fi # recursive call to return an arbitary $? value (decimal)
echo
echo 'test 1: All return codes are "as expected"'
echo  ======
 ((1==1)) && echo  " ((1==1)) rc=$? ..&&.. condition is true" || echo  " ((1==1)) rc=$? ..||.. condition is false"
  $0  0   && echo "  \$0  0   rc=$? ..&&.. condition is true" || echo "  \$0  0   rc=$? ..||.. condition is false"
 ((1!=1)) && echo  " ((1!=1)) rc=$? ..&&.. condition is true" || echo  " ((1!=1)) rc=$? ..||.. condition is false"
  $0  1   && echo "  \$0  1   rc=$? ..&&.. condition is true" || echo "  \$0  1   rc=$? ..||.. condition is false"
echo
echo 'test 2: Now throw in some "unexpected" errors into the first of the &&/|| pair' 
echo  ======
 ((1==1)) && (echo  " ((1==1)) rc=$? ..&&.. condition is true"; $0 1)  || echo  " ((1==1)) rc=$? ..||.. condition is false"
  $0  0   && (echo "  \$0  0   rc=$? ..&&.. condition is true"; $0 2)  || echo "  \$0  0   rc=$? ..||.. condition is false"
 ((1!=1)) && (echo  " ((1!=1)) rc=$? ..&&.. condition is true"; $0 3)  || echo  " ((1!=1)) rc=$? ..||.. condition is false"
  $0  1   && (echo "  \$0  1   rc=$? ..&&.. condition is true"; $0 4)  || echo "  \$0  1   rc=$? ..||.. condition is false"
echo
echo 'test 3: Now swap the order of && and || statements, using "as expected" return codes'
echo  ======
 ((1==1)) || echo  " ((1==1)) rc=$? ..||.. condition is true" && echo  " ((1==1)) rc=$? ..&&.. condition is false"
  $0  0   || echo "  \$0  0   rc=$? ..||.. condition is true" && echo "  \$0  0   rc=$? ..&&.. condition is false"
 ((1!=1)) || echo  " ((1!=1)) rc=$? ..||.. condition is true" && echo  " ((1!=1)) rc=$? ..&&.. condition is false"
  $0  1   || echo "  \$0  1   rc=$? ..||.. condition is true" && echo "  \$0  1   rc=$? ..&&.. condition is false"
echo
echo 'test 4: With the order of && and || statements still swapped, introduce "unexpected" errors into the first of the &&/|| pair' 
echo  ======
 ((1==1)) && (echo  " ((1==1)) rc=$? ..&&.. condition is true"; $0 1)  || echo  " ((1==1)) rc=$? ..||.. condition is false"
  $0  0   && (echo "  \$0  0   rc=$? ..&&.. condition is true"; $0 2)  || echo "  \$0  0   rc=$? ..||.. condition is false"
 ((1!=1)) && (echo  " ((1!=1)) rc=$? ..&&.. condition is true"; $0 3)  || echo  " ((1!=1)) rc=$? ..||.. condition is false"
  $0  1   && (echo "  \$0  1   rc=$? ..&&.. condition is true"; $0 4)  || echo "  \$0  1   rc=$? ..||.. condition is false"

exit 


1

Deneyin

yanlış & & echo "merhaba"

ve

yanlış ; yankı "merhaba"

farkı gör


0

Komut (komut dosyası durumunda) &&ilk komutun RETVAL'sine bağlı olarak çalıştırılır (komut dosyası durumunda, işlev). Başarılı olursa, ilk komutu 0 değerini döndürmeye zorlar. Daha fazla komut uygulamak için dönüş değerini kontrol edebiliriz.

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.