Вам завжди потрібні лапки навколо змінних у всіх контекстах списку , тобто скрізь змінна може бути розширена до кількох значень, якщо ви не хочете, щоб три побічні ефекти залишали змінну без котирування.
Контексти списку включають аргументи простих команд, таких як, [
або 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
, зайві пробіли та нові рядки будуть позбавлені.