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$a
danz*
. - Perluas operan pertama ke dalam nilai variabel
a
. - Evaluasi
==
operator:menguji apakah nilai variabela
cocok 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
$a
ke dalam nilai variabela
. - Lakukan pemisahan kata dan pembuatan nama file pada parameter perintah.
- Misalnya, jika nilai
a
adalah 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 =~
).