Untuk membangun komentar berwawasan chepner tentang pertanyaan:
-
Di
[ ! condition ]
,!
hanyalah sebuah argumen ke[
bawaan (alias efektif daritest
bawaan); kebetulan[
/test
menafsirkan 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
condition
secara 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-a
dan-o
karena 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
test
perintah yang keluar dengan status ekspresi yang benar. - di sisi lain, Anda meniadakan ekspresi dan
test
perintah (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