Переменные не обязательно заключать в двойные кавычки в [[ ]]
, но они должны быть заключены в кавычки для [ ]
.
Без кавычек, если $value
- пустая строка, то [ -n $value ]
- это то же самое, что [ "-n" ]
. "-n"
является строковым тестом и оценивается как непустая, а значит истинная, поэтому тест проходит успешно.
(почему? потому что -n STRING
и STRING
одинаковы для [
aka test
- они оба являются тестом на string-is-not-empty)
Дальнейшие эксперименты показывают, что это похоже на случай всех однооперационных тестов, включая файловые операторы - если операнд отсутствует, [ ]
рассматривает единственный аргумент как строковый тест. Это можно было бы считать ошибкой и исправить, если бы это не было историческим фактом, на который сценаристы полагались десятилетиями - и изменение этого факта привело бы к поломке бесчисленного количества существующих сценариев.
С кавычками, [ -n "$value" ]
точно такое же, как [ -n "" ]
, поэтому тест не проходит.
[[ ... ]]
гораздо более щадяще относится к цитированию переменных - цитирование необязательно, и тест работает одинаково как с кавычками, так и без них.
Теперь в вашем рабочем каталоге есть файл с именем "user@host
". Если бы вы скопировали его в удаленное место без указания пути,user@host:
(двоеточие примечания )назвало бы его file.txt
в любом расположении по умолчанию на этом сервере (, вероятно, user
в домашнем каталоге ). ].