bash: -eq vs. == e tipo de saída 'bc'

1

Este snippet de código foi retirado de um script maior, (humildemente) simulando a função abs() não existente:

[[ $(echo "$val < 0" | bc) -eq 1 ]] && val=$(echo "$val * -1" | bc)

Então, testamos o número se é negativo; se sim, a segunda declaração depois que o && será executado. Esta foi a minha linha original.

Algum outro usuário do SE alterou posteriormente para:

(( $(bc <<<"$val < 0") == 1 )) && val=$(bc <<<"$val * -1")

OK, embora ambos aparentemente funcionem, eu ainda prefiro o meu, pois ele não faz uso apenas do operador -eq (que foi implementado especialmente para não-strings), mas também evita strings aqui, o que faz o código funcionar melhor em ambientes somente leitura. (Tenha em mente que /tmp DEVE ser gravável para que o here-strings funcione.)

Por fim, parece que lembro que bc na linha posterior produzirá um inteiro verdadeiro, o que torna o uso de == questionável, já que isso é recomendado apenas para strings. Infelizmente, bc não revela em sua página man se ela produz seus resultados como números simples ou strings.

Opiniões?

    
por syntaxerror 17.04.2015 / 17:29

1 resposta

2

Você confundiu aqui.

Tanto [[ $(echo "$val < 0" | bc) -eq 1 ]] como (( $(bc <<<"$val < 0") == 1 )) usaram comparação inteira.

((..)) é equivalente a let incorporado em ksh , bash e zsh . Ele avaliou expressão aritmética . Dentro de ((..)) , todos os operadores e sua precedência, associatividade e valores são os mesmos que na linguagem C.

O que você confunde foi == dentro do novo operador de teste [[...]] . Quando == disponível, é equivalente a = e executa a correspondência de padrões. Você precisa de aspas duplas para fazer a comparação de string [[ "$a" == "$b" ]] .

    
por 17.04.2015 / 17:50