Citar uma variável no script de shell “if”

7

por exemplo,

if [ "$FOO" = "true" ]; then

vs

if [ $FOO = "true" ]; then

Qual é o diferente? Parece que ambas as duas afirmações também funcionam.

    
por Ryan 14.08.2013 / 06:28

3 respostas

5

Se o valor de $FOO for uma única palavra que não contenha um caractere curinga \[*? , os dois serão idênticos.

Se $FOO não estiver atribuído ou estiver vazio ou se houver mais de uma palavra (ou seja, contiver espaço em branco ou $IFS ), a versão sem aspas será um erro de sintaxe. Se acontecer de ser apenas a seqüência correta de palavras (como 0 -eq 0 -o false ), o resultado pode ser arbitrário. Portanto, é uma boa prática sempre citar variáveis em scripts de shell.

Por acaso, "true" não precisa ser citado.

    
por 14.08.2013 / 06:33
3

Para ilustrar quais problemas isso pode causar, aqui alguns exemplos.

Digamos que temos duas variáveis da seguinte forma:

FOO="some value"
BAR="some value"

Agora temos duas variáveis mantendo exatamente a mesma string / valor. Se fizéssemos algumas declarações if para testar o resultado, no seu caso:

if [ $FOO = "$BAR" ]; then echo "match"; else echo "no match"; fi

Nesse ponto, você receberá bash: [: too many arguments . O $ FOO sem aspas contém agora três valores, nomeadamente '[ , some , value' . A palavra-chave [ test não sabe o que executar porque espera que o primeiro ou o segundo argumento seja um operador.

Quando citamos "$ FOO", informamos explicitamente if para ver os valores corretos onde não há divisão de palavras.

Outro exemplo:

my_file="A random file.txt"
  • fazer rm $my_file significa remover 'A' 'aleatório' 'arquivo.txt', o que torna três arquivos.
  • fazer rm "$my_file" removerá "Um arquivo aleatório.txt", que cria um arquivo.

Espero não ter confundido você com esses exemplos.

    
por 14.08.2013 / 10:44
0

Neste 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 caso "$FOO" , ele usará a variável no total para fazer a correspondência isolando você do problema de espaço.

No entanto, se você usar $FOO e houver um caso especial, isso afetará a declaração if.

    
por 14.08.2013 / 06:32