Без кавычек разделение слов приводит к тому, что пустая строка полностью исчезает, и в результате получается команда [ -d ]
. Один непустой аргумент (]
игнорируется для подсчета аргументов) приводит к успеху [
. [ <word> ]
интерпретируется как [ -n <word> ]
, что проверяет, что <word>
не пусто. [ -d ]
читается как [ -n -d ]
и всегда выполняется успешно, поскольку -d
не является пустой строкой.
Используйте кавычки.
if [ -d "$MY_DIR" ]; then # when unset, equivalent to [ -d "" ] with two arguments