Saya mencoba memahami bagaimana prioritas operator logis bekerja di bash. Sebagai contoh, saya akan mengharapkan, bahwa perintah berikut tidak menggemakan apa pun.
true || echo aaa && echo bbb
Namun, bertentangan dengan harapan saya, bbb
akan dicetak.
Adakah yang bisa menjelaskan, bagaimana saya bisa memahami &&
. yang digabungkan dan ||
operator di bash?
Jawaban yang Diterima:
Dalam banyak bahasa komputer, operator dengan prioritas yang sama adalah asosiatif kiri. Artinya, dengan tidak adanya struktur pengelompokan, operasi paling kiri dieksekusi terlebih dahulu. Bash tidak terkecuali dalam aturan ini.
Ini penting karena, di Bash, &&
dan ||
memiliki prioritas yang sama.
Jadi yang terjadi dalam contoh Anda adalah operasi paling kiri (||
) dilakukan terlebih dahulu:
true || echo aaa
Karena true
jelas benar, ||
korsleting operator dan seluruh pernyataan dianggap benar tanpa perlu mengevaluasi echo aaa
seperti yang Anda harapkan. Sekarang tinggal melakukan operasi paling kanan:
(...) && echo bbb
Sejak operasi pertama dievaluasi ke true (yaitu memiliki status keluar 0), seolah-olah Anda sedang mengeksekusi
true && echo bbb
jadi &&
tidak akan mengalami korsleting, itulah sebabnya Anda melihat bbb
bergema.
Anda akan mendapatkan perilaku yang sama dengan
false && echo aaa || echo bbb
Catatan berdasarkan komentar
- Perlu diperhatikan bahwa aturan asosiasi kiri hanya diikuti ketika kedua operator memiliki sama hak lebih tinggi. Ini tidak terjadi ketika Anda menggunakan operator ini bersama dengan kata kunci seperti
[[...]]
atau((...))
atau gunakan-o
dan-a
operator sebagai argumen untuktest
atau[
perintah. Dalam kasus seperti itu, DAN (&&
atau-a
) lebih diutamakan daripada OR (||
atau-o
). Terima kasih atas komentar Stephane Chazelas untuk mengklarifikasi poin ini. -
Tampaknya dalam bahasa seperti C dan C
&&
memiliki prioritas lebih tinggi daripada||
yang mungkin mengapa Anda mengharapkan konstruksi asli Anda berperilaku sepertitrue || (echo aaa && echo bbb).
Ini tidak terjadi dengan Bash, bagaimanapun, di mana kedua operator memiliki prioritas yang sama, itulah sebabnya Bash mem-parsing ekspresi Anda menggunakan aturan asosiatif kiri. Terima kasih atas komentar Kevin karena telah mengemukakan hal ini.
-
Mungkin juga ada kasus di mana semua 3 ekspresi dievaluasi. Jika perintah pertama mengembalikan status keluar bukan nol,
||
tidak akan korsleting dan melanjutkan untuk menjalankan perintah kedua. Jika perintah kedua kembali dengan status keluar nol, maka&&
tidak akan korsleting juga dan perintah ketiga akan dieksekusi. Terima kasih atas komentar Ignacio Vazquez-Abrams karena telah mengemukakan hal ini.