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:
- Mengurai perintah:ini adalah
[[ … ]]konstruksi kondisional di sekitar ekspresi kondisional$a == z*. - Mengurai ekspresi kondisional:ini adalah
==operator biner, dengan operan$adanz*. - Perluas operan pertama ke dalam nilai variabel
a. - Evaluasi
==operator:menguji apakah nilai variabelacocok dengan polaz*. - Evaluasi ekspresi kondisional:hasilnya adalah hasil dari operator kondisional.
- Perintah sekarang dievaluasi, statusnya adalah 0 jika ekspresi kondisional benar dan 1 jika salah.
Begini caranya [ $a == z* ] dievaluasi:
- Mengurai perintah:ini adalah
[perintah dengan argumen yang dibentuk dengan mengevaluasi kata-kata$a,==,z*,]. - Luaskan
$ake dalam nilai variabela. - Lakukan pemisahan kata dan pembuatan nama file pada parameter perintah.
- Misalnya, jika nilai
aadalah string 6 karakterfoo 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,].
- Misalnya, jika nilai
- Jalankan perintah
[dengan parameter yang diperoleh pada langkah sebelumnya.- Dengan nilai contoh di atas,
[perintah mengeluh kesalahan sintaks dan mengembalikan status 2.
- Dengan nilai contoh di atas,
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 =~ ).