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

51

İkisi de, BASH'in sembollerin ardından başka bir komutla başlamasını işaret ediyor gibi görünüyor, ancak farklı bir fark var mı?

    
sordu Michael Terry 27.01.2011 18:01

6 cevap

65

Bu satırla:

command1 && command2

komut2, (ve yalnızca) komut1'in çıkış durumu sıfırını döndürürse, bu satırda ise çalıştırılır:

command1 ; command2

her ikisi de komut1 ve komut2 ne olursa olsun yürütülür. Noktalı virgül, bir satıra çok sayıda komut yazmanıza izin verir.

    
verilen cevap user8290 27.01.2011 18:12
40

Farkı kendiniz deneyebilirsiniz:

  1. ls /invalid/path && echo "hello!"
    / geçersiz / yol olmadığından, dizin listesini gösteremiyorum. Bir hata mesajıyla başarısız olur: "ls: / invalid / path: Böyle bir dosya veya dizin yok".
    Komutun ikinci yarısı (echo "merhaba!") hiç gerçekleştirilemedi çünkü ilk yarı başarısız oldu.

  2. ls /invalid/path ; echo "hello!"
    Aynı hata mesajı önceki gibi görünüyor, ancak bu sefer ikinci kısım çalıştırılıyor !
    ls: / invalid / path: Böyle bir dosya veya dizin yok
    merhaba!

Bu neden yararlıdır?
Archive.tar.gz isimli bir dosyayı ayıklamak istediğinizi düşünün
% Co_de% komutunu kullanabilirsiniz.
Herhangi bir sebepten dolayı arşivin çıkarılması başarısız olursa, ikinci kısım idam edilmez! Tekrar deneyebilirsiniz.

kullanırsanız; Aynı durumda arşiv silinir ve tekrar deneyemezsiniz.

    
verilen cevap Kenny Rasschaert 27.01.2011 18:37
8

&& AND , ikinci komutun yalnızca ilk doğru döndürüldüğünde (hata yok) çalıştırılacağı anlamına gelir.

    
verilen cevap Ward Muylaert 27.01.2011 18:11
6

Güncelleme : Mümkün olan bazı tuzakları vurgulamak için komut dosyası ekledim:

Hiç kimse "||" ifadesini kullanmadığı için

Güncelleme2 : bazı önemli ifadeler burada
Ve Ib amp; "doğru" ifadesine yanıt veren bir "if" ifadesinin "o zaman" şeklindedir.

|| bir "if" ifadesinin "else" i gibi NOT 'dir ..
|| "false" e yanıt veren bir "if" ifadesinin "o zaman" şeklindedir.

Daha belirgin bir şekilde & amp; & amp; $ test eder? önceki en son yürütülen ifadesinin geri dönüş değeri ve & amp; amp; & amp; doğru.

|| benzerdir ve genellikle & amp; ifadesi, ancak önceki en son yürütülen ifadesinden yanlış dönüş değeri ($?) için test eder ... NB! , Nota Bene! Dikkat edin! .... Önceden ifade edilen ifade bir & amp; Doğru olacağını düşündüğünüzde yanlış geri çekilir, sonra || false yanıt verir, böylece aynı çizgide karıştırmak riskli olabilir

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

Temel test ve & amp; & amp; ve || ifadenin hepsi aynı satırda olmalı ...

& amp ;; & amp; kullanırken her şeyin ters gidebileceğini görmek için bu komut dosyasını çalıştırın. ve ||
en son yürütülen ifadesi beklediğiniz kişi olmayabilir ..

[[koşul]] & amp; & amp; echo Merhaba || echo Goodbye .... genellikle güvenlidir,
iyi oluşturulmuş bir eko, geri dönecektir. ama çıkmayan bir dosyaya ne dersiniz?

#!/bin/bash
#
# "as expected" return codes" means: expected to behave like a normal AND / OR  contition test
#
if [[ "" != "" ]] ; then exit ; 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"
  %pre%  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"
  %pre%  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"; %pre% 1)  || echo  " ((1==1)) rc=$? ..||.. condition is false"
  %pre%  0   && (echo "  $0  0   rc=$? ..&&.. condition is true"; %pre% 2)  || echo "  $0  0   rc=$? ..||.. condition is false"
 ((1!=1)) && (echo  " ((1!=1)) rc=$? ..&&.. condition is true"; %pre% 3)  || echo  " ((1!=1)) rc=$? ..||.. condition is false"
  %pre%  1   && (echo "  $0  1   rc=$? ..&&.. condition is true"; %pre% 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"
  %pre%  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"
  %pre%  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"; %pre% 1)  || echo  " ((1==1)) rc=$? ..||.. condition is false"
  %pre%  0   && (echo "  $0  0   rc=$? ..&&.. condition is true"; %pre% 2)  || echo "  $0  0   rc=$? ..||.. condition is false"
 ((1!=1)) && (echo  " ((1!=1)) rc=$? ..&&.. condition is true"; %pre% 3)  || echo  " ((1!=1)) rc=$? ..||.. condition is false"
  %pre%  1   && (echo "  $0  1   rc=$? ..&&.. condition is true"; %pre% 4)  || echo "  $0  1   rc=$? ..||.. condition is false"

exit 
verilen cevap Peter.O 09.02.2011 07:42
1

deneme

false && echo "hello"

ve

false ; echo "hello"

farkı görün

    
verilen cevap Petrie Wong 09.02.2011 07:19
0

&& komutundan sonra komut (işlev, komut dosyası durumunda), ilk komutun RETVAL (işlev, komut dosyası durumunda) bağlı olarak yürütülür. Başarılı olursa, ilk komutu 0 değerini döndürmeye zorlar. Diğer komutları yürütmek için dönüş değerini kontrol edebiliriz.

    
verilen cevap theTuxRacer 09.02.2011 09:07

Etiketlerdeki diğer soruları oku