Alguns shells históricos implementaram um analisador muito simples que poderia ficar confuso com coisas como [ -n = "" ] , em que o primeiro operando para = se parece com um operador e analisaria isso como [ -n = ] ou causaria um erro de sintaxe. Em [ "x$1" = x"" ] , o prefixo x garante que x"$1" não possa ser semelhante a um operador e, portanto, a única maneira de o shell analisar esse teste é tratar = como um operador binário.
Todas as shells modernas, e até mesmo as mais antigas ainda em operação, seguem as regras POSIX que exige que todas as expressões de teste de até 4 palavras sejam analisadas corretamente. Portanto, [ -z "$1" ] é uma maneira apropriada de testar se $1 está vazio e [ "$x" = "$y" ] é uma maneira apropriada de testar a igualdade de duas variáveis.
Mesmo alguns shells atuais podem se confundir com expressões mais longas, e algumas expressões são realmente ambíguas, evite usar os operadores -a e -o para construir testes booleanos mais longos e, em vez disso, use chamadas separadas para [ e os operadores booleanos && e || do próprio shell.