resultado da instrução condicional diretamente no bash sem usar se

0

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

    
por sal 29.09.2018 / 23:07

2 respostas

1

Com parênteses, funciona como descrito: ([[ $r -gt 0 ]] && { echo foo $r; }) || ([[ $r -lt 0 ]] && { echo bar $r; }) || { echo foobar $r; }

    
por 29.09.2018 / 23:20
3

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 ));
    
por 29.09.2018 / 23:40