[
Komut sıradan bir komuttur. Çoğu kabuk onu verimlilik için yerleşik olarak sağlamasına rağmen, kabuğun normal sözdizimsel kurallarına uyar. son argümanını gerektirdiği halde gerektirmeyen durumlar dışında [
tamamen eşdeğerdir .test
[
]
test
İkili ayraçlar [[ … ]]
özel bir sözdizimidir. Birkaç yıl sonra ksh ile tanıtıldılar [
çünkü [
doğru kullanımı zor olabilir ve [[
kabuk özel karakterleri kullanan bazı yeni eklemelere izin verir. Mesela yazabilirsiniz
[[ $x = foo && $y = bar ]]
Tüm koşullu ifade kabuk tarafından ayrıştırılır, çünkü ise [ $x = foo && $y = bar ]
ilk iki komutları ürüne ayrılır [ $x = foo
ve $y = bar ]
ayrılmış &&
operatör. Benzer şekilde çift parantez, örüntü eşleştirme sözdizimi gibi şeyleri mümkün kılar; örneğin [[ $x == a* ]]
, x
başlangıç değeri a
; tek parantez içinde bu a*
, isimleri a
geçerli dizinde başlayan dosyaların listesine genişleyecektir . Çift parantezler önce ksh ile tanıtıldı ve sadece ksh, bash ve zsh olarak kullanılabiliyor.
Tek parantez içinde, diğer birçok yerde olduğu gibi değişken değişkenler etrafında çift tırnak kullanmanız gerekir, çünkü bunlar yalnızca bir komutun argümanlarıdır (komut olur [
). İkili parantez içinde, çift tırnak işaretine ihtiyacınız yoktur, çünkü kabuk sözcük bölme ya da globbing yapmaz: şartlı bir ifadeyi ayrıştırır, bir komutu değil.
Bir istisna olsa, [[ $var1 = "$var2" ]]
bayt baytlık bir dize karşılaştırması yapmak istiyorsanız, alıntılara ihtiyaç duyduğunuz yerde, aksi halde $var2
eşleşecek bir kalıp olur $var1
.
Yapamayacağınız bir şey [[ … ]]
operatör olarak değişken kullanmaktır. Örneğin, bu tamamen yasaldır (ancak nadiren kullanışlıdır):
if [ -n "$reverse_sort" ]; then op=-gt; else op=-lt; fi
…
if [ "$x" "$op" "$y" ]; then …
Senin örneğinde
dir="/home/mazimi/VirtualBox VMs"
if [ -d ${dir} ]; then …
içeride komut if
ise [
4 argümanlarla -d
, /home/mazimi/VirtualBox
, VMs
ve ]
. Kabuk ayrıştırır -d /home/mazimi/VirtualBox
ve sonra ne yapacağını bilemez VMs
. İyi ${dir}
biçimlendirilmiş bir komut almak için kelimelerin ayrılmasını önlemeniz gerekir .
Genel olarak konuşursak, sonuç üzerinde kelime bölme ve konuşma yapmak istemediğiniz sürece değişken ve komut değişimlerinin etrafında her zaman çift tırnak işareti kullanın. Çift tırnak kullanmamanın güvenli olduğu ana yerler:
- bir ödevde:
foo=$bar
(fakat bunun export "foo=$bar"
gibi bir dizi ödevinde çift tırnak işaretine ihtiyacınız olduğunu unutmayın array=("$a" "$b")
);
- bir
case
açıklamada case $foo in …
:;
- Sağ taraftaki dışında çift ayraç içindeki
=
veya ==
: operatörü (eğer desen eşleştirme istiyorsun sürece) [[ $x = "$y" ]]
.
Bunların hepsinde, çift tırnak kullanmak doğrudur, bu yüzden gelişmiş kuralları atlayıp tırnakları her zaman kullanabilirsiniz.