Zawsze potrzebujesz cudzysłowów wokół zmiennych we wszystkich kontekstach listy , czyli wszędzie tam, gdzie zmienna może być rozwinięta do wielu wartości, chyba że chcesz, aby 3 skutki uboczne pozostawienia zmiennej nie były cytowane.
konteksty list zawierają argumenty do prostych poleceń, takich jak [
lub echo
, for i in <here>
przypisania do tablic ... Istnieją inne konteksty, w których należy również cytować zmienne. Najlepiej jest zawsze cytować zmienne, chyba że masz bardzo dobry powód, aby tego nie robić.
Pomyśl o braku cudzysłowów (w kontekście list) jako o operatorze split + glob .
Jakby echo $test
było echo glob(split("$test"))
.
Zachowanie powłoki jest mylące dla większości ludzi, ponieważ w większości innych języków umieszczasz cudzysłowy wokół ustalonych ciągów znaków, takich jak puts("foo")
, a nie wokół zmiennych (jak puts(var)
), podczas gdy w powłoce jest odwrotnie: wszystko jest ciągiem znaków w powłoce, więc umieszczanie cudzysłowów wokół wszystkiego byłoby kłopotliwe, ty echo test
nie musisz "echo" "test"
. W powłoce cudzysłowy są używane do czegoś innego: zapobiegają specjalnemu znaczeniu niektórych znaków i / lub wpływają na zachowanie niektórych rozszerzeń.
W [ -n $test ]
lub echo $test
powłoka zostanie podzielona $test
(domyślnie na puste), a następnie wygeneruje nazwę pliku (rozwiń wszystkie *
wzorce „?” ... do listy pasujących plików), a następnie przekaże tę listę argumentów do poleceń [
lub echo
.
Ponownie pomyśl o tym jak "[" "-n" glob(split("$test")) "]"
. Jeśli $test
jest pusty lub zawiera tylko spacje (spc, tab, nl), to operator split + glob zwróci pustą listę, więc [ -n $test ]
będzie "[" "-n" "]"
, co jest testem sprawdzającym, czy „-n” jest pustym łańcuchem, czy nie. Ale wyobraź sobie, co by się stało, gdyby $test
„*” lub „= foo” ...
W [ -n "$test" ]
, [
jest przekazywana cztery argumenty "["
, "-n"
, ""
oraz "]"
(bez cudzysłowów), który jest to, co chcemy.
Niezależnie od tego, czy to robi różnicę, echo
czy [
nie, po prostu echo
generuje to samo, niezależnie od tego, czy przekazano pusty argument, czy nie.
Zobacz także tę odpowiedź na podobne pytanie, aby uzyskać więcej informacji na temat [
polecenia i [[...]]
konstrukcji.
echo
, dodatkowe spacje i znaki nowej linii zostaną usunięte.