GNU/Linux >> Belajar Linux >  >> Linux

Apakah ada perbedaan antara meniadakan sebelum/sesudah perintah tes?

Untuk membangun komentar berwawasan chepner tentang pertanyaan:

  • Di [ ! condition ] , ! hanyalah sebuah argumen ke [ bawaan (alias efektif dari test 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

Linux
  1. Apa perbedaan antara perintah locate dan find di Linux?

  2. Apakah ada perbedaan antara file biner yang dapat dieksekusi antara distribusi?

  3. Apa perbedaan antara &> dan >&di bash?

  1. Apakah ada perbedaan antara daemon dan layanan?

  2. Perbedaan antara cp -r dan cp -R (perintah salin)

  3. Perbedaan antara 'man ls' dan 'ls --help'?

  1. Perbedaan Antara Sumber ('.' Atau 'sumber') Dan Mengeksekusi File Di Bash?

  2. Perbedaan Antara Operator Bash [[ Vs [ Vs ( Vs ((?

  3. Perbedaan Antara Perintah Bawaan Dan Yang Tidak?