Esse código está errado, ele não funciona se o argumento não estiver vazio (e não começar com espaço em branco) porque [
não é um caractere especial e não é reconhecido como comando se não for uma palavra separada (que nem sequer funcionaria com [[
).
set -x
mostra o que a shell vê:
set -x
[$1 = ]
+ '[' = ']'
Nesse caso, o resultado do teste é verdadeiro porque existe uma string entre [
e ]
; não importa que seja =
.
Os testes para um argumento não vazio devem ser feitos como
[ -n "$1" ] ; echo $?
+ '[' -n '' ']'
+ echo 1
ou
[ -z "$1" ] ; echo $?
+ '[' -z '' ']'
+ echo 0
em vez