Este é um problema comum em muitas linguagens de script. A questão é que os nomes das variáveis são expandidos para seus valores antes que a linha seja executada. Se a variável for deixada em branco, o script executará o código:
if ==word (goto oh)
Os dois sinais de igual não são analisados como o operador de igualdade porque o IF espera encontrar um item para comparação em ambos os lados. Em vez de (goto
, um operador como EQU
é esperado e uma mensagem de erro refletirá isso.
Um problema semelhante ocorrerá se o usuário inserir uma string contendo espaços, por exemplo:
if what I typed==word (goto oh)
Esse comportamento pode ser usado para todos os tipos de código sujo. Como exemplo, a condição será avaliada como verdadeira se o usuário inserir 'palavra', mas também se inserir '== palavra EQU', nesse caso a linha será analisada como: if ==word EQU ==word (goto oh)
. Geralmente, não queremos lidar com esses casos de borda com muita frequência e podemos evitar o problema com variáveis em branco adicionando caracteres fictícios, por exemplo: if %a%dummy==%b%dummy
. Desta forma, a sintaxe será válida mesmo que uma (ou ambas) das variáveis estejam vazias. Nos arquivos em lote, um caractere fictício particularmente útil é o "-symbol, pois também evita que os espaços sejam analisados como delimitadores. O código a seguir deve ser significativamente mais robusto:
if "%ui%"=="%word%" (goto oh)