GNU/Linux >> Belajar Linux >  >> Linux

Perbedaan Antara [[ $a ==Z* ]] Dan [ $a ==Z* ]?

Apakah ada perbedaan antara keduanya.

[[ $a == z* ]]

dan

[ $a == z* ] 

Dapatkah saya memiliki contoh di mana mereka akan memiliki output yang berbeda?

Selanjutnya bagaimana cara kerja [[ ]] berbeda dari [ ] ?

Jawaban yang Diterima:

Perbedaan antara [[ … ]] dan [ … ] sebagian besar tercakup dalam Mengapa ekspansi parameter dengan spasi tanpa tanda kutip berfungsi di dalam tanda kurung ganda “[[” tetapi tidak di dalam tanda kurung tunggal “[“?.
Yang terpenting, [[ … ]] adalah sintaks khusus, sedangkan [ adalah nama yang tampak lucu untuk sebuah perintah. [[ … ]] memiliki aturan sintaks khusus untuk apa yang ada di dalamnya, [ … ] tidak.

Dengan tambahan kerutan wildcard, begini caranya [[ $a == z* ]] dievaluasi:

  1. Mengurai perintah:ini adalah [[ … ]] konstruksi kondisional di sekitar ekspresi kondisional $a == z* .
  2. Mengurai ekspresi kondisional:ini adalah == operator biner, dengan operan $a dan z* .
  3. Perluas operan pertama ke dalam nilai variabel a .
  4. Evaluasi == operator:menguji apakah nilai variabel a cocok dengan pola z* .
  5. Evaluasi ekspresi kondisional:hasilnya adalah hasil dari operator kondisional.
  6. Perintah sekarang dievaluasi, statusnya adalah 0 jika ekspresi kondisional benar dan 1 jika salah.

Begini caranya [ $a == z* ] dievaluasi:

  1. Mengurai perintah:ini adalah [ perintah dengan argumen yang dibentuk dengan mengevaluasi kata-kata $a , == , z* , ] .
  2. Luaskan $a ke dalam nilai variabel a .
  3. Lakukan pemisahan kata dan pembuatan nama file pada parameter perintah.
    • Misalnya, jika nilai a adalah string 6 karakter foo b* (diperoleh dengan mis. a='foo b*' ) dan daftar file di direktori saat ini adalah (bar , baz , qux , zim , zum ), maka hasil perluasannya adalah daftar kata berikut:[ , foo , bar , baz , == , zim , zum , ] .
  4. Jalankan perintah [ dengan parameter yang diperoleh pada langkah sebelumnya.
    • Dengan nilai contoh di atas, [ perintah mengeluh kesalahan sintaks dan mengembalikan status 2.

Catatan:Dalam [[ $a == z* ]] , pada langkah 3, nilai a tidak mengalami pemisahan kata dan pembuatan nama file, karena dalam konteks di mana satu kata diharapkan (argumen sebelah kiri dari operator kondisional == ). Dalam kebanyakan kasus, jika satu kata masuk akal pada posisi itu maka ekspansi variabel berperilaku seperti dalam tanda kutip ganda. Namun, ada pengecualian untuk aturan itu:di [[ abc == $a ]] , jika nilai a berisi wildcard, lalu abc dicocokkan dengan pola wildcard. Misalnya, jika nilai a adalah a* lalu [[ abc == $a ]] benar (karena karakter pengganti * berasal dari perluasan $a . yang tidak dikutip cocok dengan bc ) sedangkan [[ abc == "$a" ]] salah (karena karakter biasa * berasal dari perluasan kutipan $a tidak cocok dengan bc ). Di dalam [[ … ]] , tanda kutip ganda tidak membuat perbedaan, kecuali di sisi kanan operator pencocokan string (= , == , != dan =~ ).

Terkait:Cetak baris yang cocok dan baris ke-n dari baris yang cocok?
Linux
  1. Apa Perbedaan Antara Sudo Su – Dan Sudo Su —?

  2. Perbedaan Getty dan Agetty?

  3. Centos – Perbedaan Shutdown 18:00 dan Shutdown 18:00?

  1. Perbedaan Antara .exrc Dan .vimrc?

  2. Perbedaan Antara '$ . Foo' Dan '$ ./foo'??

  3. Perbedaan Antara ~/.profile Dan ~/.bash_profile?

  1. Perbedaan Nss dan Pam?

  2. Perbedaan antara tumpukan Java dan tumpukan C asli

  3. Apa perbedaan antara strtok_r dan strtok_s di C?