Untuk membangun komentar berwawasan chepner tentang pertanyaan:
-
Di
[ ! condition ],!hanyalah sebuah argumen ke[bawaan (alias efektif daritestbawaan); kebetulan[/testmenafsirkan argumen!sebagai negasi. -
Di
! [ condition ],!adalah sebuah kata kunci shell yang meniadakan perintah apa pun yang diikuti oleh (yang kebetulan adalah[dalam hal ini).
Satu hal yang ! [ condition ] sintaks secara implisit memberi Anda bahwa negasi berlaku untuk [ condition ] apa pun dievaluasi menjadi secara keseluruhan , jadi jika itu maksudnya, Anda tidak perlu khawatir tentang prioritas operator.
Dari segi performa , sintaks mana yang Anda pilih mungkin tidak membuat banyak perbedaan; tes cepat menyarankan:
-
Jika
conditionsecara harfiah sama dalam kedua kasus, meneruskan!sebagai argumen untuk[jauh lebih cepat. -
Jika
!digunakan sebagai kata kunci , dan karena itu Anda dapat menyederhanakan kondisi dengan tidak mengkhawatirkan prioritas, ini mungkin sedikit lebih cepat (mis.,! [ 0 -o 1 ]vs.[ ! \( 0 -o 1 \) ]; perhatikan bahwa spesifikasi POSIX. melarang penggunaan-adan-okarena ambiguitas).
Artinya, jika kita berbicara tentang Bash , maka Anda harus mempertimbangkan untuk menggunakan [[ bukannya [ , karena [[ adalah kata kunci shell yang mem-parsing ekspresi terlampir dalam konteks khusus yang:
- menawarkan lebih banyak fitur
- memungkinkan Anda menggabungkan ekspresi dengan aman dengan
&&dan|| - dihadirkan dengan lebih sedikit kejutan
- juga sedikit lebih cepat (walaupun itu jarang berarti dalam praktiknya)
Lihat jawaban saya ini.
! meniadakan kode keluar dari perintah berikut:
$ ! test 1 = 1 || echo $? # negate command with true expression
1
Seperti yang dikatakan di halaman manual, test (dan [ serupa builtin) exit dengan status yang ditentukan dengan mengikuti ekspresi :
$ test ! 1 = 1 || echo $? # return false expression
1
$ [ ! 1 = 1 ] || echo $?
1
Untuk ekspresi tertentu :
- di satu sisi Anda meniadakan
testperintah yang keluar dengan status ekspresi yang benar. - di sisi lain, Anda meniadakan ekspresi dan
testperintah (atau[) keluar dengan status palsunya
Keduanya akan memiliki efek yang sama.
Jadi saya akan mengatakan bahwa sintaks ini setara. Dengan keuntungan untuk ! eksternal untuk memungkinkan meniadakan tes gabungan :
$ ! [ 1 = 1 -a 2 = 2 ] || echo $?
1