Como o bash interpreta o operador de igualdade sem espaços adjacentes em uma condicional?

5

O script a seguir não se comporta como eu esperava. Adicionando espaços ao redor do '=' na condicional fez com que ele executasse como eu queria, mas me fez pensar, o que ele está realmente fazendo dentro do condicional?

#!/bin/bash
S1='foo'
S2='bar'
if [ $S1=$S2 ];
then
    echo "S1('$S1') is equal to S2('$S2')
fi
echo $S1
echo $S2

A saída é:

S1('foo') is equal to S2('bar')
foo
bar

Os conteúdos de S1 e S2 não mudam do que eles estão atribuídos, então o = não executa uma tarefa.

    
por Cory Klein 18.02.2011 / 21:37

2 respostas

10

É útil lembrar que [ é realmente um comando, geralmente também disponível como test . No bash, é um builtin, então você pode ver a documentação com man builtin .

Nesse documento:

          test and [ evaluate conditional expressions using a set of rules
          based on the number of arguments.

          0 arguments
                 The expression is false.
          1 argument
                 The expression is true if and only if the argument is not
                 null.
          2 arguments
                 [...]
          3 arguments
                 [...]

As regras de dois argumentos são vários testes, e os de três argumentos são geralmente comparações. Quando você coloca um espaço ao redor do =, você obtém três argumentos. Mas quando você coloca tudo junto, você obtém o argumento um e, como você pode ver, se esse argumento não for nulo, ele retornará verdadeiro.

    
por 18.02.2011 / 21:52
4

O operador equals não faz nada neste caso.

A expressão $ S1 = $ S2 é avaliada como uma string real, com os valores de S1 e S2 no lugar, efetivamente a string literal "foo = bar".

Como essa string literal não é nula, a instrução

if [ "foo=bar" ];

é avaliado como verdadeiro e o corpo da instrução if é executado.

    
por 18.02.2011 / 21:41