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ı?
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:
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.
Farkı kendiniz deneyebilirsiniz:
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.
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.
&&
olan AND
ilk tek gerçek (hata) iade ise ikinci komut sadece çalıştırır yani.
AND
uygulamada, birincisi eşittir false
ve 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 .
&&
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 if
açıklamada bu bağlamda , ama bu aslen kullanımını niyetiyle aslında uzakta almaz içinde gerçek bir koşullu if
deyimi. Burada kullanımı gerçekten bir "kesmek" dir.
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.
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
Deneyin
yanlış & & echo "merhaba"
ve
yanlış ; yankı "merhaba"
farkı gör
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.