[
Komenda jest zwykłym poleceń. Chociaż większość powłok zapewnia go jako wbudowaną funkcję zwiększania wydajności, przestrzega ona normalnych reguł składniowych powłoki. [
jest dokładnie równoważne test
, z wyjątkiem tego, że [
wymaga on ]
jako ostatniego argumentu i test
nie robi tego.
Podwójne nawiasy kwadratowe [[ … ]]
mają specjalną składnię. Zostały one wprowadzone w ksh (kilka lat później [
), ponieważ [
ich używanie może być kłopotliwe i [[
pozwala na nowe fajne dodatki, które używają znaków specjalnych powłoki. Na przykład możesz pisać
[[ $x = foo && $y = bar ]]
ponieważ całe wyrażenie warunkowe jest analizowane przez powłokę, podczas gdy [ $x = foo && $y = bar ]
najpierw zostanie podzielone na dwie komendy [ $x = foo
i $y = bar ]
rozdzielone przez &&
operatora. Podobnie podwójne nawiasy kwadratowe umożliwiają takie rzeczy, jak składnia dopasowania wzorca, np. [[ $x == a* ]]
Sprawdzenie, czy wartość x
zaczyna się od a
; w pojedynczych nawiasach rozwinie się a*
to do listy plików, których nazwy zaczynają się a
od bieżącego katalogu. Podwójne nawiasy kwadratowe zostały po raz pierwszy wprowadzone w ksh i są dostępne tylko w ksh, bash i zsh.
W nawiasach pojedynczych należy używać podwójnych cudzysłowów wokół podstawień zmiennych, tak jak w większości innych miejsc, ponieważ są one tylko argumentami polecenia (którym jest to [
polecenie). W podwójnych nawiasach kwadratowych nie potrzebujesz podwójnych cudzysłowów, ponieważ powłoka nie wykonuje dzielenia ani globowania słów: analizuje wyrażenie warunkowe, a nie polecenie.
Wyjątkiem jest jednak [[ $var1 = "$var2" ]]
sytuacja, w której potrzebujesz cudzysłowów, jeśli chcesz wykonać porównanie ciągów bajt-bajt, w przeciwnym razie $var2
byłby to wzorzec do dopasowania $var1
.
Jednej rzeczy, z którą nie można zrobić, [[ … ]]
jest użycie zmiennej jako operatora. Na przykład jest to całkowicie legalne (ale rzadko przydatne):
if [ -n "$reverse_sort" ]; then op=-gt; else op=-lt; fi
…
if [ "$x" "$op" "$y" ]; then …
W twoim przykładzie
dir="/home/mazimi/VirtualBox VMs"
if [ -d ${dir} ]; then …
komenda wewnątrz if
jest [
z 4 argumentów -d
, /home/mazimi/VirtualBox
, VMs
i ]
. Powłoka analizuje, -d /home/mazimi/VirtualBox
a następnie nie wie, co z tym zrobić VMs
. Będziesz musiał zapobiec dzieleniu słów, ${dir}
aby uzyskać poprawnie sformułowane polecenie.
Ogólnie rzecz biorąc, zawsze używaj podwójnych cudzysłowów wokół podstawień zmiennych i poleceń, chyba że wiesz, że chcesz wykonać dzielenie słów i globowanie wyniku. Główne miejsca, w których nie można używać podwójnych cytatów, to:
- w zadaniu:
foo=$bar
(ale zauważ, że potrzebujesz podwójnych cudzysłowów w export "foo=$bar"
lub w przypisaniach tablicowych, takich jak array=("$a" "$b")
);
- w
case
oświadczeniu case $foo in …
:;
- wewnątrz podwójnych nawiasach wyjątkiem prawej strony
=
lub ==
operatora (chyba, że chcesz zrobić pasujące do wzorca) [[ $x = "$y" ]]
.
We wszystkich tych przypadkach poprawne jest stosowanie podwójnych cudzysłowów, więc równie dobrze możesz pominąć zaawansowane reguły i używać cudzysłowów przez cały czas.