Primeiro, observe que o -z
test é explicitamente para:
the length of string is zero
Ou seja, uma string contendo apenas espaços deve não ser verdadeira em -z
, porque tem um tamanho diferente de zero.
O que você deseja é remover os espaços da variável usando a substituição de padrão expansão de parâmetros :
[[ -z "${param// }" ]]
Isso expande a variável param
e substitui todas as correspondências do padrão (um único espaço) por nada, portanto, uma string que tenha apenas espaços será expandida para uma string vazia.
O detalhes de como isso funciona é que ${var/pattern/string}
substitui a primeira correspondência mais longa de pattern
com string
. Quando pattern
começa com /
(como acima), ele substitui all as correspondências. Como a substituição está vazia, podemos omitir o% final/
e o valor string
:
${parameter/pattern/string}
The pattern is expanded to produce a pattern just as in filename expansion. Parameter is expanded and the longest match of pattern against its value is replaced with string. If pattern begins with ‘/’, all matches of pattern are replaced with string. Normally only the first match is replaced. ... If string is null, matches of pattern are deleted and the / following pattern may be omitted.
Depois de tudo isso, acabamos com ${param// }
para excluir todos os espaços.
Observe que, embora presente em ksh
(onde originou), zsh
e bash
, essa sintaxe não é POSIX e não deve ser usada em sh
scripts.