GNU/Linux >> Belajar Linux >  >> Linux

Diutamakan Operator Logika Shell &&, ||?

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 untuk test 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 seperti

    true || (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.

Terkait:Berikan hak atas sertifikat ke aplikasi melalui shell?
Linux
  1. Script Shell Hang Pada Perintah Mail?

  2. Cara Mengubah Shell Default Di Linux

  3. Bagaimana cara mengubah karakter hex ke ASCII di shell Linux?

  1. Bagaimana cara mendapatkan nama cabang git saat ini menjadi variabel dalam skrip Shell?

  2. Cakupan variabel untuk skrip bash shell dan fungsi dalam skrip

  3. Apa gunanya $# di Bash

  1. Menyesuaikan shell Bash

  2. Inti Dari Perintah Eksternal `cd`?

  3. linux shell wc -c hitung karakter +1