** Matemática de ponto flutuante seguro para injeção em bash / shell **
Nota: O foco desta resposta é fornecer idéias para uma solução segura para injeção para executar matemática no bash (ou em outras conchas). Obviamente, o mesmo pode ser usado, com pequenos ajustes para executar o processamento avançado de strings, etc.
A maioria das soluções apresentadas apresenta um pequeno scriptlet em tempo real, usando dados externos (variáveis, arquivos, linha de comando, variáveis de ambiente). A entrada externa pode ser usada para injetar código malicioso no mecanismo, muitos deles
Abaixo está uma comparação sobre o uso de vários idiomas para realizar cálculos matemáticos básicos, onde o resultado é em ponto flutuante. Calcula A + B * 0,1 (como ponto flutuante).
Todas as tentativas de solução evitam criar scriptslet dinâmicos, que são extremamente difíceis de manter. Em vez disso, eles usam programa estático e passam parâmetros para a variável designada. Eles manipularão com segurança parâmetros com caracteres especiais - reduzindo a possibilidade de injeção de código. A exceção é 'BC', que não fornece recurso de entrada / saída
A exceção é 'bc', que não fornece nenhuma entrada / saída, todos os dados são fornecidos por programas em stdin e toda saída é enviada para stdout. Todos os cálculos estão sendo executados em uma caixa de proteção, o que não permite efeito colateral (abertura de arquivos etc.). Em teoria, injeção segura por design!
A=5.2
B=4.3
# Awk: Map variable into awk
# Exit 0 (or just exit) for success, non-zero for error.
#
awk -v A="$A" -v B="$B" 'BEGIN { print A + B * 0.1 ; exit 0}'
# Perl
perl -e '($A,$B) = @ARGV ; print $A + $B * 0.1' "$A" "$B"
# Python 2
python -c 'import sys ; a = float(sys.argv[1]) ; b = float(sys.argv[2]) ; print a+b*0.1' "$A" "$B"
# Python 3
python3 -c 'import sys ; a = float(sys.argv[1]) ; b = float(sys.argv[2]) ; print(a+b*0.1)' "$A" "$B"
# BC
bc <<< "scale=1 ; $A + $B * 0.1"