Isso é:
if
first list of commands
then
second list of commands
else
third list of commands
fi
Isso é para executar a segunda lista de comandos se a primeira lista de comandos retornar com um status de saída verdadeiro / sucesso (zero), ou seja, se o último comando de execução lá retorna com um status de saída zero.
Em:
var=-2 && ((var += 2))
É cmd1 && cmd2 , em que cmd2 só é executado se cmd1 for bem-sucedido.
var=-2
Em geral, será bem-sucedido, desde que $var não tenha sido somente leitura, portanto, o comando ((var += 2)) será executado:
((arithmetic expression))
Retorna sucesso / verdadeiro desde que a expressão seja corretamente avaliada (sem erro de sintaxe) e o resultado da expressão seja diferente de zero.
-
((123)),((1 + 1)),((1 == 1))return true -
((0)),((-2 + 2)),((2 == -2))return false. -
((4294967296 * 4294967296))retorna falso na maioria dos shells devido a quebra de números inteiros de 64 bits
var += 2 como uma expressão aritmética, executa a atribuição e resolve o valor que está sendo atribuído, aqui 0, portanto, o status de saída falso .
Você pode ver o valor com base no status de saída, usando a sintaxe de expansão aritmética $((...)) :
$ echo "$((1 + 1)) $((2 == 2)) $((2 == -2)) $((var = -2)) $((var += 2))"
2 1 0 -2 0
Ou atribuindo-o a uma variável:
$ var=-2; ((result = (var += 2)))
$ echo "$? $result $var"
1 0 0
$? contém o status de saída do comando anterior. No que diz respeito a if / then / else / fi , 0 significa verdadeiro, qualquer outra coisa significa falso.
A confusão vem do fato de que, para expressões aritméticas, ocorre o contrário: 0 significa falso e qualquer outra coisa significa verdadeiro (por exemplo, 2 == 2 é 1 , enquanto 2 < 1 é 0 ).
Para evitar se preocupar com a diferença, esqueça de $? e seus possíveis valores. Pense apenas em termos de true / falso , sucesso / falha .
grep -q foo file
Retorna verdadeiro se foo for encontrado em file .
[ "$a" = "$b" ]
Retorna verdadeiro se $a contiver a mesma coisa que $b .
((6 * 3 - 12))
((4 == 1))
Retorna verdadeiro se o resultado da expressão aritmética for um número diferente de zero.
Não importa se os true / false são expressos em termos de 0 ou 1 do status de saída desses comandos grep / [ ou ((...)) construct.