Вам завжди потрібні лапки навколо змінних у всіх контекстах списку , тобто скрізь змінна може бути розширена до кількох значень, якщо ви не хочете, щоб три побічні ефекти залишали змінну без котирування.
Контексти списку включають аргументи простих команд, таких як, [або echo, for i in <here>призначення масивів ... Є й інші контексти, де змінні також потрібно цитувати. Найкраще завжди цитувати змінні, якщо у вас є дуже вагома причина цього не робити.
Подумайте про відсутність лапок (у контекстах списку) як оператора split + glob .
Наче echo $testбуло echo glob(split("$test")).
Поведінка оболонки бентежить для більшості людей, тому що в більшості інших мов ви ставите лапки навколо фіксованих рядків, як puts("foo"), а не навколо змінних (як puts(var)), тоді як в оболонці це навпаки: все рядок в оболонці, тому ставити лапки навколо всього було б громіздко, вам echo test, не потрібно "echo" "test". У оболонці цитати використовуються для чогось іншого: запобігають якомусь особливому значенню деяких символів та / або впливають на поведінку деяких розширень.
У [ -n $test ]або echo $testоболонка розділиться $test(за замовчуванням за замовчуванням), а потім виконає генерацію імен файлів (розгорніть всі *шаблони, '?' ... до списку відповідних файлів), а потім передасть цей список аргументів командам [або echo.
Знову ж, подумайте про це як "[" "-n" glob(split("$test")) "]". Якщо $testпорожній або містить лише пробіли (spc, tab, nl), тоді оператор split + glob поверне порожній список, тож [ -n $test ]буде "[" "-n" "]"тестом, який перевіряє, чи "-n" є порожнім рядком чи ні. Але уявіть, що було б, якби $test"*" або "= foo" ...
В [ -n "$test" ], [передаються чотири аргументи "[", "-n", ""і "]"(без лапок), який є те , що ми хочемо.
Незалежно від того, echoчи [це не має значення, це просто те, що echoвиводить те саме, чи передано порожній аргумент чи взагалі немає аргументу.
Дивіться також цю відповідь на подібне запитання, щоб отримати докладнішу інформацію про [команду та [[...]]конструкцію.
echo, зайві пробіли та нові рядки будуть позбавлені.