Caractere extra antes da comparação da string [duplicado]
Em alguns códigos bash, vejo que um caractere extra é adicionado antes da comparação da string. Alguém pode explicar o motivo?
if [ "x$VAR" = "xString" ]; then
...
fi
Respostas
Você verá isso para se proteger contra a possibilidade de a variável ser desconfigurada. Considere, por exemplo:
if [ $x = "hi" ]; then echo $x; fi
Se xestiver definido como hi, o comportamento é:
$ if [ $x = "hi" ]; then echo $x; fi hi $
No entanto, se xnão estiver definido, você obterá um erro porque não há nada à esquerda de =:
$ if [ $x = "hi" ]; then echo $x; fi
zsh: parse error: condition expected: =
Adicionar aspas resolve o problema:
$ if [ "$x" = "hi" ]; then echo $x; fi
$
Além disso, adicionar algum valor não vazio resolve o problema:
$ if [ x$x = "xhi" ]; then echo $x; fi
$ x=hi $ if [ x$x = "xhi" ]; then echo $x; fi
hi
$
Você provavelmente já viu isso sem as aspas, como [ x$VAR = xstring ]
Se por algum motivo VAR não tiver sido definido, ele não se expandirá para nada e o interpretador de script dará um erro, como -bash: [: =: unary operator expected. (Quer dizer, o intérprete vai ver [ = string ]e protestar contra isso.) Ao adicionar um caractere extra em ambos os lados, você garante que o "nada" será "alguma coisa" e ainda assim =será válido. Porém, com aspas, você não obterá esse erro, mas muitas pessoas simplesmente adicionam um caractere extra - por hábito, e não prestam muita atenção às aspas.
Isso é feito para evitar que a string fique vazia, mesmo se $VARIABLEestiver vazia. A bashconstrução
if [ $var = Y ]
se comporta mal se $varfor "".