por exemplo
if [ "$FOO" = "true" ]; then
vs
if [ $FOO = "true" ]; then
Qual é a diferença? Parece que as duas instruções também funcionam.
bash
shell
shell-script
quoting
Ryan
fonte
fonte
a='foo bar'; [[ $a == "foo bar" ]]
. No entanto, uma variável que não contenha caracteres glob não precisa ser:[[ $a == $a ]]
. A expansão do Word não é executada entre colchetes duplos. E para a correspondência de regex, o padrão no lado direito não deve ser citado ou ele vai ser tomado como string literal:[[ $a =~ .*oo.*r ]]
(o padrão deve ser em uma variável citou-un, no entanto, em vez disso ...[[ $a == foo* ]]
. Você pode fornecer exemplos adicionais de um requisito para citação além do meu exemplo de string literal?Respostas:
Se o valor de
$FOO
for uma única palavra que não contenha um caractere curinga\[*?
, as duas serão idênticas.Se
$FOO
não estiver atribuído, estiver vazio ou mais de uma palavra (ou seja, contiver espaço em branco ou$IFS
), a versão não citada será um erro de sintaxe. Se for a sequência correta de palavras (como0 -eq 0 -o false
), o resultado poderá ser arbitrário. Portanto, é uma boa prática sempre citar variáveis em scripts de shell.Aliás,
"true"
não precisa ser citado.fonte
Para ilustrar quais problemas isso pode causar, aqui estão alguns exemplos.
Digamos que temos duas variáveis como segue:
Agora temos duas variáveis segurando exatamente a mesma string / valor. Se fizemos algumas declarações if para testar o resultado, no seu caso:
Neste ponto, você receberá
bash: [: too many arguments
. O $ FOO não cotado possui agora três valores, a saber'[ , some , value'
.[
A palavra-chave test não sabe o que executar, pois espera que o primeiro ou o segundo argumento seja um operador.Quando citamos "$ FOO", dizemos explicitamente
if
para observar os valores corretos onde não ocorre a divisão de palavras.Outro exemplo:
rm $my_file
significa remover 'A' 'aleatório' 'arquivo.txt', o que torna três arquivos.rm "$my_file"
removerá "Um arquivo aleatório.txt", que cria um arquivo.Espero não ter confundido você com esses exemplos.
fonte
Nesse caso específico, não há diferença.
No entanto, se
$FOO
contiver um espaço ou alguns caracteres especiais, você terá um problema.No
"$FOO"
caso, ele usará a variável no total, para fazer a partida isolar você do problema de espaço.No entanto, se você usar
$FOO
e houver um caso especial, isso afetará a instrução if.fonte