Aritmética do Bash
Outra solução possível é adicionar uma função simples à aritmética integrada do Bash. Coloque isso no seu .bashrcarquivo para tentar:
=() {
echo "$(($@))"
}
Então agora você não precisa $((...))mais, apenas o =que parece bastante natural.
Substituição
Outra coisa se você quiser ser ainda mais rápido: você pode substituí-lo ppor +e xpor *. Isso funcionará para isso:
=() {
local IFS=' '
local calc="${*//p/+}"
calc="${calc//x/*}"
echo "$(($calc))"
}
= 5 x 5 # Returns 25
= 50p25 # Returns 75
Agora você nem precisa Shiftmais, a única coisa que está = na frente da aritmética.
Saída hexadecimal
A saída pode ser exibida em decimal e hexadecimal, se desejado. ( Nota : o uso de xsubstituição entrará em conflito com a 0x...sintaxe hexadecimal)
=() {
local answer="$(($@))"
printf '%d (%#x)\n' "$answer" "$answer"
}
Exemplo:
$ = 16 + 0x10
272 (0x110)
$ = 16**3 + 16**4
69632 (0x11000)
Usando bc
Se você quiser cálculos um pouco mais avançados, você pode canalizá-lo para bcassim:
=() {
local IFS=' '
local calc="${*//p/+}"
calc="${calc//x/*}"
bc -l <<<"scale=10;$calc"
}
= 'sqrt(2)' # Returns 1.4142135623
= '4*a(1)' # Returns pi (3.1415926532)
As funções fornecidas por bcsão as seguintes (e podem ser encontradas em man bc):
sqrt ( expression )
The value of the sqrt function is the square root of the expression.
If the expression is negative, a run time error is generated.
s (x) The sine of x, x is in radians.
c (x) The cosine of x, x is in radians.
a (x) The arctangent of x, arctangent returns radians.
l (x) The natural logarithm of x.
e (x) The exponential function of raising e to the value x.
j (n,x)
The Bessel function of integer order n of x.
Ele também suporta if, for, whilee variáveis como uma linguagem de programação que se pode ser melhor para escrever para um arquivo se você queria isso.
Tenha em mente que ele vai substituir pe xem função / variável nomes. Pode ser melhor apenas remover as substituições.
Usando gcalccmd
Você também pode fazer a chamada de função gcalccmd(de gnome-calculator) da seguinte maneira:
=() {
local IFS=' '
local calc="$*"
# Uncomment the below for (p → +) and (x → *)
#calc="${calc//p/+}"
#calc="${calc//x/*}"
printf '%s\n quit' "$calc" | gcalccmd | sed 's:^> ::g'
}
= 'sqrt(2)' # Returns 1.4142135623
= '4^4' # Returns 256
As funções disponíveis parecem ser (tiradas diretamente do código fonte ), ==denotam funções equivalentes:
ln()
sqrt()
abs()
int()
frac()
sin()
cos()
tan()
sin⁻¹() == asin()
cos⁻¹() == acos()
tan⁻¹() == atan()
sinh()
cosh()
tanh()
sinh⁻¹() == asinh()
cosh⁻¹() == acosh()
tanh⁻¹() == atanh()
ones()
twos()