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.