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 $testbył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 testnie 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 $testpowł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 $testjest 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ę, echoczy [nie, po prostu echogeneruje 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.