Caractere extra antes da comparação da string [duplicado]

Nov 03 2020

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

3 AndyDalton Nov 03 2020 at 22:56

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
$
1 Pourko Nov 03 2020 at 22:56

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.

waltinator Nov 03 2020 at 22:56

Isso é feito para evitar que a string fique vazia, mesmo se $VARIABLEestiver vazia. A bashconstrução

if [  $var = Y ]

se comporta mal se $varfor "".