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.