jangan pernah menggunakan operator `-a` atau` -o` dengan `[`

11

Stéphane Chazelas menulis:

beberapa aturan suka

  • selalu mengutip variabel
  • jangan pernah gunakan operator -aatau -o(gunakan beberapa [perintah dan operator &&dan ||shell)

Dapat [diandalkan dengan cangkang POSIX.

Mengapa "tidak pernah menggunakan -aatau -ooperator"?

Bagaimana saya bisa "menggunakan beberapa [perintah dan operator &&dan ||shell)"?

Tim
sumber

Jawaban:

13

Mengapa "tidak pernah menggunakan -aatau -ooperator"?

Karena mereka mungkin amibigu dan karenanya mereka tidak kompatibel dengan POSIX :

Ekstensi XSI yang menentukan primer -a dan -o biner dan operator '(' dan ')' telah dianggap usang. (Banyak ekspresi yang menggunakannya didefinisikan secara ambigu oleh tata bahasa tergantung pada ekspresi spesifik yang sedang dievaluasi.) Skrip yang menggunakan ekspresi ini harus dikonversi ke bentuk yang diberikan di bawah ini. Meskipun banyak implementasi akan terus mendukung formulir-formulir usang ini, skrip harus sangat berhati-hati ketika berhadapan dengan input yang disediakan pengguna yang dapat dikacaukan dengan ini dan primary dan operator lainnya. Kecuali pengembang aplikasi mengetahui semua kasus yang menghasilkan input ke skrip, doa seperti:

test "$1" -a "$2"

harus ditulis sebagai:

test "$1" && test "$2"

Bagaimana saya bisa "menggunakan beberapa [perintah dan operator &&dan ||shell)"?

Dengan melakukan beberapa tes dan merantai mereka menggunakan operator tersebut; sebagai contoh:

[ 0 -eq 0 -a \( 0 -eq 1 -o 1 -eq 1 \) ]

dapat ditulis ulang sebagai yang setara:

[ 0 -eq 0 ] && ([ 0 -eq 1 ] || [ 1 -eq 1 ])

atau lebih baik:

[ 0 -eq 0 ] && { [ 0 -eq 1 ] || [ 1 -eq 1 ]; }
kos
sumber
Terima kasih. (1) "operator '(' dan ')' telah dianggap usang". Apakah (dan )operator yang memerintahkan grup? Jika mereka usang, apa penggantinya? (2) Harus test "$1" -a "$2"diganti dengan test "$1" && test "$2", atau oleh ((test "$1" && test "$2"))? Bukankah kita membutuhkannya ((..))?
Tim
@Tim. Lihat pembaruan. (1) Ya - Anda dapat menggunakan ()dan {}sebagai penggantinya. (2) Yang pertama; (())digunakan untuk ekspansi aritmatika, di sini Anda ingin menguji status keluar dari rantai tes, jadi kelompokkan tes dalam subkulit ()atau dalam shell saat ini {}.
kos
Terima kasih. Saya pikir pertanyaan saya dapat melampaui posting ini. Jadi saya mempostingnya di posting baru.
Tim
1
@Tim Satu-satunya alasan untuk menggunakan (dan )operator adalah ketika Anda menggunakan -aatau -o. Karena yang terakhir sudah usang, yang pertama jelas tidak lagi dibutuhkan.
Barmar