Os operandos das comparações numéricas -eq
, -gt
, -lt
, -ge
, -le
e -ne
são tomados como expressões aritméticas. Com algumas limitações, eles ainda precisam ser palavras de casca simples.
O comportamento dos nomes de variáveis na expressão aritmética é descrito em Aritmética do Shell :
Variáveis de shell são permitidas como operandos; a expansão do parâmetro é executada antes da expressão ser avaliada. Dentro de uma expressão, variáveis de shell também podem ser referenciadas por nome sem usar a sintaxe de expansão de parâmetro. Uma variável de shell que é nula ou não definida é avaliada como 0 quando referenciada pelo nome sem usar a sintaxe de expansão do parâmetro.
e também:
O valor de uma variável é avaliado como uma expressão aritmética quando é referenciada
Mas não consigo encontrar a parte da documentação em que se diz que as comparações numéricas usam expressões aritméticas. Não é descrito em Construções condicionais em [[
, nem em Expressões condicionais de bash .
Mas, por experimento, parece funcionar como dito acima.
Então, coisas assim funcionam:
a=6
[[ a -eq 6 ]] && echo y
[[ 1+2+3 -eq 6 ]] && echo y
[[ "1 + 2 + 3" -eq 6 ]] && echo y
isso também (o valor da variável é avaliado):
b='1 + 2 + 3'
[[ b -eq 6 ]] && echo y
Mas isso não acontece; não é uma única palavra de shell quando a [[ .. ]]
análise é analisada; portanto, há um erro de sintaxe na condicional:
[[ 1 + 2 + 3 -eq 6 ]] && echo y
Em outros contextos aritméticos, não há necessidade de a expressão ficar sem espaço em branco. Isso é impresso 999
, pois os colchetes delimitam inequivocamente a expressão aritmética no índice:
a[6]=999; echo ${a[1 + 2 + 3]}
Por outro lado, a =
comparação é uma correspondência de padrões e não envolve aritmética, nem a expansão automática de variáveis feita em um contexto aritmético (Construções Condicionais):
Quando os operadores ==
e !=
são usados, a cadeia à direita do operador é considerada um padrão e é correspondida de acordo com as regras descritas abaixo em Correspondência de padrões, como se a opção de shell extglob estivesse ativada. O =
operador é idêntico a ==
.
Portanto, isso é falso, pois as strings são obviamente diferentes:
[[ "1 + 2 + 3" = 6 ]]
como é isso, mesmo que os valores numéricos sejam os mesmos:
[[ 6 = 06 ]]
e aqui também as comparações ( x
e 6
) são diferentes:
x=6
[[ x = 6 ]]
Isso expandiria a variável, no entanto, então isso é verdade:
x=6
[[ $x = 6 ]]
x=1
seguido por[[ x -gt 2]]
?