Mereka berdua mengisyaratkan BASH untuk memulai dengan perintah lain mengikuti simbol tetapi apakah ada perbedaan yang berbeda?
Mereka berdua mengisyaratkan BASH untuk memulai dengan perintah lain mengikuti simbol tetapi apakah ada perbedaan yang berbeda?
Jawaban:
Dengan garis ini:
command1 && command2
command2 akan dieksekusi jika (dan hanya jika) command1 mengembalikan status keluar nol, sedangkan di baris ini:
command1 ; command2
baik command1 dan command2 akan dieksekusi tanpa peduli. Tanda titik koma memungkinkan Anda mengetik banyak perintah pada satu baris.
Anda dapat mencoba perbedaannya sendiri:
ls /invalid/path && echo "hello!"
karena / tidak valid / path tidak ada, ia tidak dapat menampilkan daftar direktori. Ini akan gagal dengan pesan kesalahan: "ls: / invalid / path: Tidak ada file atau direktori".
Bagian kedua dari perintah (echo "hello!") Bahkan tidak pernah dieksekusi karena bagian pertama gagal.
ls /invalid/path ; echo "hello!"
Pesan kesalahan yang sama muncul seperti sebelumnya, tetapi kali ini, bagian kedua dieksekusi !
ls: / invalid / path: Tidak ada file atau direktori tersebut
halo!
Mengapa ini berguna?
Misalkan Anda ingin mengekstrak file bernama archive.tar.gz
Anda bisa menggunakan perintah tar zxvf archive.tar.gz && rm archive.tar.gz
.
Jika karena alasan apa pun ekstraksi arsip gagal, bagian kedua tidak dijalankan! Anda bisa coba lagi.
Jika Anda menggunakan; dalam situasi yang sama, arsip dihapus dan Anda tidak dapat mencoba lagi.
&&
adalah AND
, yang berarti bahwa perintah kedua hanya akan dieksekusi jika yang pertama dikembalikan dengan benar (tidak ada kesalahan).
AND
eksekusi parameter ke-2 menjadi tidak relevan jika yang pertama sama false
dan dengan demikian kode yang mendasarinya dioptimalkan untuk menunda evaluasi parameter ke-2 sampai ia tahu apa yang pertama.
&&
hanyalah operator biner, sebuah fungsi. Satu-satunya hal yang "istimewa" adalah notasi infiks (yang merupakan standar untuk sebagian besar dari operator semacam ini) dan menunda pelaksanaan operan kedua. Eksekusi yang tertunda itu memang memberikannya kemampuan untuk digunakan sebagai sesuatu yang dapat secara konseptual dipandang sebagai if
pernyataan dalam konteks ini , tetapi itu tidak menghilangkan fakta bahwa penggunaan yang semula dimaksudkannya adalah dalam kondisi if
pernyataan aktual . Penggunaan di sini benar-benar lebih dari "hack".
a && b || c = (a && b) || c
. Urutan evaluasi sederhana. Benar-benar tidak ada misteri di sana. Jika Anda ingin menuliskannya seperti fungsi khas Anda, itu akan terlihat seperti or(and(a, b), c)
. Logika ini sama dalam if
kondisi dan juga ketika memasukkannya langsung ke baris perintah karena &&
dan ||
adalah operator , mereka mengambil dua operan dan mereka mengembalikan yang lain.
Pembaruan : Saya telah menambahkan sebagai skrip untuk menyoroti beberapa perangkap yang mungkin:
Karena tidak ada orang lain yang menyebutkan "||", saya akan melakukannya
Pembaruan2 : beberapa pengulangan kata-kata penting di sini
&& adalah seperti pernyataan "lalu" dari pernyataan "jika" yang merespons "benar"
|| adalah TIDAK seperti "lain" dari "jika" pernyataan ..
|| seperti "lalu" dari pernyataan "jika" yang merespons "salah"
Lebih spesifik, && menguji $? mengembalikan nilai pernyataan yang terakhir dieksekusi sebelumnya dan memberikan kontrol ke pernyataan atau sub-shell segera setelah && ... hanya melewati kontrol jika $? adalah benar.
|| mirip, dan sering terlihat mengikuti pernyataan &&, tetapi tes untuk palsu nilai kembali ($?) dari sebelumnya yang paling baru-baru ini dieksekusi pernyataan ... NB! , Nota Bene! Catat dengan baik! .... jika pernyataan predecing adalah pernyataan && yang mengoreksi kembali kesalahan ketika Anda mengharapkannya benar, maka || akan merespons yang salah, sehingga menggabungkan keduanya pada baris yang sama mungkin berisiko
Poin utama yang saya coba buat adalah sehubungan dengan kesalahan yang saya buat. yaitu:
## [[kondisi]] && A || B
adalah tidak tidak berperilaku seperti C / C ++ gaya ternary. yaitu:
// (kondisi)? A: B
Lihat skrip di bawah ini untuk contoh hasil "tak terduga" dari "A"
Tes dasar dan && dan || pernyataan semua harus di baris yang sama ...
Jalankan skrip ini untuk mengetahui kesalahan apa yang terjadi saat menggunakan && dan ||
Pernyataan yang baru saja dieksekusi mungkin bukan yang Anda harapkan ..
[[kondisi]] && gema Halo || echo Goodbye .... biasanya aman,
karena gema yang terbentuk dengan baik akan mengembalikan true.
tetapi bagaimana dengan mengakses file yang tidak keluar?
#!/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
mencoba
false && echo "hello"
dan
Salah ; gema "halo"
Lihat perbedaannya
Perintah (fungsi, dalam kasus skrip) setelah &&
dijalankan tergantung pada RETVAL dari perintah pertama (fungsi, dalam kasus skrip). Ini memaksa perintah pertama untuk mengembalikan nilai 0, jika berhasil. Kami dapat memeriksa nilai kembali untuk menjalankan perintah lebih lanjut.