Operator && bir sonraki komutu yürütürse, eğer önceki komut başarılı bir şekilde yürütülürse, (return kodunu döndürdü ($?) 0 = mantıksal doğru).
Formunda A && B || C
, komutu (veya durum) bir değerlendirilir ve eğer bir döner doğru (başarı, çıkış kodu 0) komut B yürütülür. Eğer A başarısız olursa (bu nedenle false döndürür - 0 dışında çıkış kodu) ve / veya B başarısız olursa ( false döndürür ) C çalıştırılır.
Ayrıca &&
operatör bir AND olarak kontrollerde kullanılır ve operatör VEYA||
gibi çalışır durum kontrollerinde .
Komut dosyanızla ne yapmak istediğinize bağlı olarak, form A && B || C
örneğin örneğiniz gibi durum kontrolleri için kullanılabilir veya komutları zincirlemek için kullanılabilir ve önceki komutların başarılı bir çıkış kodu 0 olması durumunda yürütülecek bir dizi komutun olmasını sağlamak için kullanılabilir .
Bu nedenle, aşağıdaki gibi komutları görmek yaygındır:
do_something && do_something_else_that_depended_on_something
.
Örnekler:
apt-get update && apt-get upgrade
Güncelleme başarısız olursa, yükseltme gerçekleştirilmez, (gerçek dünyada mantıklı ...).
mkdir test && echo "Something" > test/file
Parça echo "Something"
sadece mkdir test
başarılı olursa çalıştırılır ve işlem 0 çıkış kodunu döndürür .
./configure --prefix=/usr && make && sudo make install
Genellikle gerekli bağımlı komutları bir araya getirmek için işleri derlerken bulunur.
Eğer yukarıdaki "zincirleri" uygularsanız if - then - else ile basit bir görev için çok daha fazla komuta ve kontrol (ve böylece daha fazla kod yazmak için - daha fazla yanlış iş) gerekir.
Ayrıca, && ve || soldan sağa doğru kabuk tarafından okunur. Önceki komutların başarılı çıktısına bir sonraki basamağa bağlı olarak komutları ve koşul kontrollerini gruplandırmanız gerekebilir. Örneğin şuna bakın:
root@debian:$ true || true && false;echo $?
1
#read from left to right
#true OR true=true AND false = false = exit code 1=not success
root@debian:$ true || (true && false);echo $?
0
# true OR (true AND false)=true OR false = true = exit code 0 = success
Veya gerçek hayattan bir örnek:
root@debian:$ a=1;b=1;c=1;[[ $a -eq 1 ]] || [[ $b -eq 1 ]] && [[ $c -eq 2 ]];echo $?
1
#condition $a = true OR condition b = true AND condition $c = false
#=> yields false as read from left to right, thus exit code=1 = not ok
root@debian:$ a=1;b=1;c=1;[[ $a -eq 1 ]] || [[ $b -eq 1 && $c -eq 2 ]];echo $?
0
#vars b and c are checked in a group which returns false,
#condition check of var a returns true, thus true OR false yields true = exit code 0
(Örnek komut GNU için bazı komutlar infaz sürecine bağlı olarak farklı çıkış kodları unutmayın, ya iade farklı kodları eylemlerinin bağlı diff
, döner 1 iki eğer dosyalar farklıdır ve 0 gelmezlerse). Bu tür komutların && ve ||.
Ayrıca tüm bulmacayı bir araya getirmek için, ;
operatörü kullanarak komutların birleştirilmesine dikkat edin . Bir biçim sayesinde A;B;C
tüm komutlar olursa olsun komutun çıkış kodu ne seride yürütülecektir A
ve B
.