Com parênteses, funciona como descrito: ([[ $r -gt 0 ]] && { echo foo $r; }) || ([[ $r -lt 0 ]] && { echo bar $r; }) || { echo foobar $r; }
imprima o nome do arquivo com mais linhas e quantas mais ele possui (um espaço entre o nome e o número). Se houver um empate, a saída deve ser "foobar 0". ex .: foo tem mais 1 linha: "foo 1"; barra tem mais 3 linhas: "bar 3", mesmo # linhas: "foobar 0". NÃO há declarações.
por que isso não está funcionando: [[ $r -gt 0 ]] && { echo foo $r; } || [[ $r -lt 0 ]] && { echo bar $r; } || { echo foobar $r; }
$ r é a diferença entre os dois arquivos
Note que seus casos são separados, então você realmente não precisa do ||
.
[[ $r -gt 0 ]] && echo foo $r; # positive
[[ $r -lt 0 ]] && echo bar $r; # negative
[[ $r -eq 0 ]] && echo foobar $r; # zero
why is this not working
&&
e ||
são avaliados da esquerda para a direita, não há diferença na precedência entre eles, o que dificulta a lógica do if .. then .. else
style com eles.
Você precisa adicionar o agrupamento manualmente com chaves ou parênteses. (Ou apenas use a instrução if
, está lá por um motivo.)
Por exemplo, isso sempre imprime nonnegative
, independentemente de se negative
imprime:
[ $x -ge 0 ]] || echo negative && echo nonnegative
Se você quiser a diferença como um valor positivo, será necessário negá-lo no meio, por exemplo:
[[ $r -lt 0 ]] && echo bar $(( -r ));
Tags bash linux shell command shell-script