Основная проблема заключается в том, что вы опустили двойные кавычки вокруг подстановки переменной . Когда вы пишете $ help
, в большинстве случаев это не означает «принять значение help
», это означает «принять значение help
, интерпретировать его как список шаблонов подстановочных знаков, разделенных пробелами, и заменять каждый шаблон списком совпадающих имен файлов, если совпадает хотя бы одно имя файла ».
Если help
пусто, [-n $ help]
расширяется до списка из трех слов [
, -n
, ]
, поскольку результатом split + glob для пустой строки является пустой список слов. Если в скобках заключено одно слово, условие выполняется, если слово не пусто. -n
не пусто, поэтому условие истинно.
Исправление заключается в записи [-n "$ help"]
: когда help
пусто, это расширяется до списка из четырех слов [
, -n
, пустое слово, ]
. Это применяет оператор -n
к пустому слову, и условие ложно.
Альтернативным решением является использование [[-n $ help]]
. Двойные скобки - это особый синтаксис с разными правилами синтаксического анализа (тогда как одиночные скобки - это обычная команда с забавным названием). Внутри двойных скобок вы можете опустить двойные кавычки вокруг подстановок переменных в большинстве контекстов, за исключением правой части =
, ==
, ! =
] и = ~
.Вы можете написать [[-n "$ help"]]
, если хотите, поэтому вам не нужно запоминать исключения, в которых разрешено оставлять двойные кавычки: просто не забывайте всегда заключать в двойные кавычки подстановки переменных (аналогично подстановкам команд: "$ (foo)"
).