The [
perintah perintah biasa. Meskipun sebagian besar shell menyediakannya sebagai built-in untuk efisiensi, shell mematuhi aturan sintaksis normal shell. [
persis sama dengan test
, kecuali yang [
membutuhkan ]
argumen terakhir dan test
tidak.
Kurung ganda [[ … ]]
adalah sintaks khusus. Mereka diperkenalkan di ksh (beberapa tahun setelah [
) karena [
dapat merepotkan untuk digunakan dengan benar dan [[
memungkinkan beberapa tambahan bagus baru yang menggunakan karakter khusus shell. Misalnya, Anda bisa menulis
[[ $x = foo && $y = bar ]]
karena seluruh ekspresi kondisional diuraikan oleh shell, sedangkan [ $x = foo && $y = bar ]
pertama-tama akan dibagi menjadi dua perintah [ $x = foo
dan $y = bar ]
dipisahkan oleh &&
operator. Demikian pula tanda kurung ganda memungkinkan hal-hal seperti sintaksis pencocokan pola, misalnya [[ $x == a* ]]
untuk menguji apakah nilai x
diawali dengan a
; dalam kurung tunggal ini akan diperluas a*
ke daftar file yang namanya dimulai dengan a
di direktori saat ini. Kurung ganda pertama kali diperkenalkan dalam ksh dan hanya tersedia dalam ksh, bash, dan zsh.
Di dalam tanda kurung tunggal, Anda perlu menggunakan tanda kutip ganda di sekitar substitusi variabel, seperti di sebagian besar tempat lain, karena mereka hanya argumen untuk perintah (yang kebetulan adalah [
perintah). Di dalam tanda kurung ganda, Anda tidak perlu tanda kutip ganda, karena shell tidak melakukan pemisahan kata atau globbing: ia menguraikan ekspresi kondisional, bukan perintah.
Pengecualian adalah di [[ $var1 = "$var2" ]]
mana Anda membutuhkan tanda kutip jika Anda ingin melakukan perbandingan string byte-ke-byte, jika tidak, $var2
akan menjadi pola yang cocok $var1
.
Satu hal yang tidak dapat Anda lakukan [[ … ]]
adalah menggunakan variabel sebagai operator. Misalnya, ini legal (tetapi jarang bermanfaat):
if [ -n "$reverse_sort" ]; then op=-gt; else op=-lt; fi
…
if [ "$x" "$op" "$y" ]; then …
Dalam contoh Anda
dir="/home/mazimi/VirtualBox VMs"
if [ -d ${dir} ]; then …
perintah dalam if
adalah [
dengan 4 argumen -d
, /home/mazimi/VirtualBox
, VMs
dan ]
. Shell mengurai -d /home/mazimi/VirtualBox
dan kemudian tidak tahu apa yang harus dilakukan VMs
. Anda perlu mencegah pemisahan kata ${dir}
untuk mendapatkan perintah yang dibuat dengan baik.
Secara umum, selalu gunakan tanda kutip ganda di sekitar penggantian variabel dan perintah kecuali jika Anda tahu Anda ingin melakukan pemisahan kata dan globbing pada hasilnya. Tempat-tempat utama di mana aman untuk tidak menggunakan tanda kutip ganda adalah:
- dalam penugasan:
foo=$bar
(tetapi perhatikan bahwa Anda membutuhkan tanda kutip ganda dalam export "foo=$bar"
atau dalam penugasan array seperti array=("$a" "$b")
);
- dalam sebuah
case
pernyataan case $foo in …
:;
- dalam kurung ganda kecuali di sisi kanan
=
atau ==
operator (kecuali jika Anda melakukan ingin pencocokan pola): [[ $x = "$y" ]]
.
Dalam semua ini, itu benar untuk menggunakan tanda kutip ganda, jadi Anda mungkin juga melewatkan aturan lanjutan dan menggunakan tanda kutip sepanjang waktu.