GNU/Linux >> Belajar Linux >  >> Linux

Beberapa Operator Logika, ((a || B) &&C), Dan “Kesalahan sintaksis Dekat Token Tak Terduga”?

Saya bekerja dengan Bash 3, dan saya mencoba membentuk kondisional. Di C/C++, sangat sederhana:((A || B) && C) . Di Bash, ternyata tidak (saya pikir penulis Git pasti telah menyumbangkan kode ini sebelum mereka pindah ke usaha lain).

Ini tidak bekerja. Perhatikan bahwa <0 or 1> bukan literal string; artinya 0 atau 1 (umumnya berasal dari grep -i ).

A=<0 or 1>
B=<0 or 1>
C=<0 or 1>
if [ [ "$A" -eq "0" ] || [ "$B" -ne "0" ] ] && [ "$C" -eqe "0" ]; then ... fi

Hasilnya adalah:

line 322: syntax error near unexpected token `[['

Saya kemudian mencoba:

A=<0 or 1>
B=<0 or 1>
C=<0 or 1>
if [ ([ "$A" -eq "0" ]) || ([ "$B" -ne "0" ]) ] && [ "$C" -eq "0" ]; then ... fi

hasilnya:

line 322: syntax error near unexpected token `[['

Sebagian dari masalah adalah hasil pencarian adalah contoh sepele, dan bukan contoh yang lebih kompleks dengan kondisional majemuk.

Bagaimana cara melakukan ((A || B) && C) simple sederhana di Bash?

Saya siap untuk membuka gulungannya dan mengulangi perintah yang sama di beberapa blok:

A=<0 or 1>
B=<0 or 1>
C=<0 or 1>

if [ "$A" -eq "0" ] && [ "$C" -eq "0" ]; then
    ...
elif [ "$B" -ne "0" ] && [ "$C" -eq "0" ]; then
    ... 
fi

Jawaban yang Diterima:

Sintaks bash tidak seperti C, meskipun sebagian kecil terinspirasi oleh C. Anda tidak bisa begitu saja mencoba menulis kode C dan mengharapkannya berfungsi.

Poin utama dari shell adalah menjalankan perintah. Perintah kurung terbuka [ adalah perintah, yang melakukan satu tes¹. Anda bahkan dapat menulisnya sebagai test (tanpa braket penutup akhir). || dan && operator adalah operator shell, mereka menggabungkan perintah , bukan tes.

Jadi ketika Anda menulis

[ [ "$A" -eq "0" ] || [ "$B" -ne "0" ] ] && [ "$C" -eq "0" ]

yang diuraikan sebagai

[ [ "$A" -eq "0" ] ||
[ "$B" -ne "0" ] ] &&
[ "$C" -eq "0" ]

yang sama dengan

test [ "$A" -eq "0" ||
test "$B" -ne "0" ] &&
test "$C" -eq "0"

Perhatikan tanda kurung yang tidak seimbang? Ya, itu tidak baik. Upaya Anda dengan tanda kurung memiliki masalah yang sama:tanda kurung palsu.

Sintaks untuk mengelompokkan perintah bersama adalah kurung kurawal. Cara kurung kurawal diurai memerlukan perintah lengkap sebelumnya, jadi Anda harus menghentikan perintah di dalam kurung kurawal dengan baris baru atau titik koma.

if { [ "$A" -eq "0" ] || [ "$B" -ne "0" ]; } && [ "$C" -eq "0" ]; then …

Ada cara alternatif yaitu dengan menggunakan tanda kurung ganda. Tidak seperti tanda kurung tunggal, tanda kurung ganda adalah sintaksis shell khusus. Mereka membatasi ekspresi kondisional. Di dalam tanda kurung ganda, Anda dapat menggunakan tanda kurung dan operator seperti && dan || . Karena tanda kurung ganda adalah sintaks shell, shell mengetahui bahwa ketika operator ini berada di dalam tanda kurung, mereka adalah bagian dari sintaks ekspresi kondisional, bukan bagian dari sintaks perintah shell biasa.

if [[ ($A -eq 0 || $B -ne 0) && $C -eq 0 ]]; then …

Jika semua tes Anda numerik, masih ada cara lain, yang membatasi ekspresi artihmetik. Ekspresi aritmatika melakukan perhitungan bilangan bulat dengan sintaks yang sangat mirip dengan C.

if (((A == 0 || B != 0) && C == 0)); then …

Anda mungkin menganggap primer braket bash saya berguna.

Terkait:Debian – Sistem crash – karakter aneh di syslog?

[ dapat digunakan di sh biasa. [[ dan (( khusus untuk bash (dan ksh dan zsh).

Itu juga dapat menggabungkan beberapa tes dengan operator boolean, tetapi ini rumit untuk digunakan dan memiliki jebakan yang halus jadi saya tidak akan menjelaskannya.


Linux
  1. Tutorial Pemrograman Linux C Part 11 - Operator Aritmatika, Relasional, dan Logika

  2. Bagaimana Menjalankan Grep Dengan Banyak Dan Pola?

  3. Memuat Pustaka Bersama Dan Penggunaan Ram?

  1. Bash:Kesalahan Sintaks Dekat Token Tak Terduga `}'?

  2. “Kesalahan Sintaks Dekat Token Tak Terduga” Setelah Mengedit .bashrc?

  3. Konfigurasi dan Tuning OpenVAS di Kali Linux

  1. Diutamakan Operator Logika Shell &&, ||?

  2. kesalahan sintaksis di dekat token tak terduga ' - bash

  3. IPv6 dan NAT, merutekan ke beberapa ISP