Considere o seguinte:
$ echo "-1" | bc
-1
$ echo "(1)" | bc
1
$ echo "+1" | bc
(standard_in) 1: syntax error
O sinal de menos e os colchetes são tratados corretamente, mas quando o sinal de mais explícito é especificado bc
ocorre erro. É possível tratar números explicitamente positivos como números positivos normais?
Quero ser capaz de calcular construções como:
+1++2
(o resultado deve ser 3)
Até mesmo uma simples calculadora do Ubuntu pode realizar essas operações:
É estranho que bc
não possa. Parece um bug.
Como solução alternativa, sed
pode ser usado para pré-processar a entrada para bc
, ou talvez bc
tenha alguma configuração específica para isso? Ou pode haver alguma alternativa para bc
isso?
Atualizar
Enviei uma solicitação à bc
equipe de suporte do para considerar a correção desse bug.
Comentários de Kusalananda :
bc
é um utilitário POSIX e, portanto, qualquer implementação do utilitário deve seguir a especificação POSIX . Esta especificação contém uma gramática que não inclui a operação unária mais. Se o GNU implementar um unário plus em sua implementação dobc
, eles precisariam garantir que todo o código existente que usabc
ainda funcione como antes e que qualquer código futuro que usebc
funcione como um leitor do padrão esperaria.Observe também que isso
-1--2
é um erro, então você parece propor adicionalmente uma mudança na precedência dos operadores de incremento e decremento, certo?
Meu comentário:
Acho que
bc
deveria ser capaz de realizar cálculos simples, como uma calculadora simples pode fazer. Se a equipe de suporte adicionarbc
pelo menos a capacidade de lidar com casos com dígitos como -1--2 (com resultado 1) e +1++2 (com resultado 3) (apenas operação unária mais para dígitos, e não cair com erro ao tentar para executar operações de incremento/decremento em dígitos que ainda não são suportados) no meu entendimento, isso não afetará de forma alguma o código compatível com POSIX existente ou futuro.
Experimente isto:
Você pode usar um shell
bash
diretamente, mas é um pouco complicado e possivelmente não tão robusto:O princípio para ambos é o mesmo. Prefixamos
0+
tudo o que, dado que estamos prestes a colapsar vários+
sinais, nos permite trabalhar com1+2
ou+1+2
(o segundo resultando temporariamente em0++1+2
). Em seguida, reduzimos sequências consecutivas de {+
e espaço} para um único+
.bc
até agora não suporta operação unária plus para dígitos. Também considera++
operações--
como incremento e decremento, embora não sejam suportadas para dígitos.Isto é para casos de sinais de mais e de menos (adicionando suporte à operação de mais unário, corrigindo erros relacionados a incrementos e decrementos):
Precisa especialmente lidar com os seguintes casos:
sed
descrição do pré-processamento:s/\([-+]\) *+ */\1/g
- recolhe todas as ocorrências de- +
(com qualquer quantidade de espaços entre elas) para-
;+ +
para+
s/--/+/g
- substitui--
por+
s/^ *+//
- remove o líder+
(se houver)Casos com
+ -
e- -
já são suportados porbc
:Como alternativa aos
bc
cálculos simples, você pode fazer cálculos com a calculadora bash integrada -Arithmetic Expansion $((expression))
:Como calcular no Bash [3 exemplos práticos]