O problema fundamental é que você omitiu aspas duplas em torno de uma substituição de variável . Quando você escreve $help
, na maioria dos contextos, isso não significa “pegar o valor de help
”, isso significa “pegar o valor de help
, interpretá-lo como uma lista separada por espaço em branco de padrões de caractere curinga e substitua cada padrão pela lista de nomes de arquivos correspondentes se pelo menos um nome de arquivo corresponder ”.
Quando help
está vazio, [ -n $help ]
expande para a lista de três palavras [
, -n
, ]
, pois o resultado de split + glob em uma sequência vazia é uma lista vazia de palavras. Quando há uma única palavra entre parênteses, a condição é verdadeira a menos que a palavra esteja vazia. -n
não está vazio, então a condição é verdadeira.
A correção é escrever [ -n "$help" ]
: quando help
está vazio, isso é expandido para a lista de quatro palavras [
, -n
, palavra vazia, ]
. Isso aplica o operador -n
à palavra vazia e a condição é falsa.
Uma solução alternativa é usar [[ -n $help ]]
. Os colchetes duplos são sintaxe especial, com diferentes regras de análise (enquanto colchetes são um comando comum com um nome engraçado). Dentro de colchetes duplos, você pode deixar aspas duplas em torno das substituições de variáveis na maioria dos contextos, com exceção do lado direito de =
, ==
, !=
e =~
. Você pode escrever [[ -n "$help" ]]
se quiser, então você não precisa se lembrar das exceções onde deixar as aspas duplas é permitido: apenas lembre-se de sempre colocar aspas duplas em torno de substituições de variáveis (e similarmente em torno de substituições de comandos: "$(foo)"
) .