En Linux, use Shell para escribir una calculadora simple, que solo necesita realizar las cuatro funciones de suma, resta, multiplicación y división.
No es necesario que lo escribas. Hay un comando bc disponible, por lo que no es necesario descargarlo.
Si tienes que escribir uno, lo hay. en la función de zsh, llamada zcalc,
Publicado para usted
#!/usr/bin/zsh -i
#
# Calculadora Zsh Entiende la mayoría de las expresiones aritméticas comunes. p>
# La edición de líneas y el historial están disponibles. Una línea en blanco o `q' sale.
#
# Se ejecuta como un script o una función. Si se usa como una función, el historial
# se recuerda para su reutilización en una llamada posterior (y también actualmente en el propio historial del
# shell). ). Hay varios problemas al usar esto como
# script, por lo que se recomienda una función.
#
# El mensaje muestra un número para el actual. línea El resultado correspondiente
# se puede hacer referencia con $
# 1> 32 + 10
# 42
# 2> $1 ** 2
# 1764
# El conjunto de números recordados se prepara con cualquier cosa dada en el comando
# línea Por ejemplo,
# zcalc '2 * 16'
# 1> 32 # impreso por función
# 2> $1 + 2 # escrito por. usuario
# 34
# 3>
# Aquí, 32 se almacena como $1. Esto funciona de la manera obvia para cualquier
#
# Si la biblioteca mathfunc está disponible, probablemente comprenda la mayoría de las funciones matemáticas del sistema
# El paréntesis izquierdo debe ser adyacente. al
# final del nombre de la función, para distinguir de los parámetros del shell
# (traducción: para evitar que los mantenedores tengan que escribir p
roper
# análisis anticipado). Por ejemplo,
# 1> sqrt(2)
# 1.4142135623730951
# es correcto, pero `sqrt (2)' te dará un error.
#
# Puedes hacer cosas con parámetros como
# 1> pi = 4.0 * atan(1)
# también. Estos van en parámetros globales, así que tenga cuidado. Sin embargo, puede declarar# variables locales:
# 1>. local pi
# pero tenga en cuenta que esto no puede aparecer en la misma línea que un cálculo. No
# utilice las variables enumeradas en las líneas "local" y "entera". a continuación
# (traducción: no puedo molestarme en proporcionar una zona de pruebas).
#
# Algunas constantes ya están disponibles: (distingue entre mayúsculas y minúsculas, ya que siempre):
# PI pi, es decir, 3.1415926545897931
# E e, es decir, 2.7182818284590455
#
# También puedes cambiar el base de salida.
# 1> [#16]
# 1>
# Cambia la salida predeterminada a hexadecimal con números precedidos por `16#'.
# Tenga en cuenta que la línea no se recuerda.
# 2> [##16]
# 2>
# Cambiar la base de salida predeterminada a hexadecimal sin prefijo.
# 3> [#]
# Restablecer la base de salida predeterminada.
#
# Esto se basa en la característica incorporada que le permite cambiar la base de salida
# de una expresión determinada. Por ejemplo,
# 1> [##16] 32 +. 20 / 2
# 2A
# 2>
# imprime el resultado del cálculo en hexadecimal.
#
# No puedes cambiar la base de entrada predeterminada, pero el shell permite cualquier pequeña
ll
# entero como base:
# 1> 2#1111
# 15
# 2> [##13 ] 13#6 * 13#9
# 42
# y también se entiende la notación estándar tipo C con un 0x inicial para hexadecimal
#. Sin embargo, el 0 inicial para octal no se entiende.
# es demasiado confuso en una calculadora. Utilice 8#777, etc.
#
# Opciones. : -#
# de manera similar -##
# un discriminador de base al frente, respectivamente.
#
#
# Para hacer:
# - separar el historial de zcalc del historial del shell usando matrices --- o permitir
# zsh cambiar internamente hacia y desde el historial basado en matrices.
emular -L zsh
setopt extendedglob
la línea local y los formularios base defbase coinciden con mbegin mend psvar optlist opt arg
local compcontext="-math-"
entero num outdigits outform= 1
# Usamos nuestro propio archivo de historial con un pop automático al salir.
history -ap "${ZDOTDIR:-$HOME}/.zcalc_history"
forms=( '%2$g' '%.*g' '%.*f' '%.*E' )
zmodload -i zsh/mathfunc 2>/ dev/null
: ${ZCALCPROMPT="%1v> "}
# Proporciona algunas constantes.
float PI E
(( PI = 4 * atan(1), E = exp(1) ))
# Procesar línea de comando
while [[ -n $1 && $1 = -(|[ #-]* ) ]]; hacer
optlist=${1[2,-1]}
turno
[[ $optlist = (| -) ]] && break
while [[ -n $optlist ]];
st[1]}
optlist=${optlist[2,-1]}
case $opt in
('#') # Base predeterminada
if [[ -n $optlist ]] entonces
arg=$optlist
optlist=
elif [[ -n $1 ]] entonces
arg=$1
shift
else
print "-# requiere un argumento" >&2 p>
devuelve 1
fi
si [[ $arg != (|\#)[[:digit:]]## ]]; >
print - "-# requiere un número decimal como argumento" >&2
devuelve 1
fi
defbase="[#${ arg}]"
;;
esac
hecho
hecho
for (( num = 1 num <= $#; num++ )); do
# Asegúrese de que todos los argumentos hayan sido evaluados.
# El `$' antes del segundo argumento fuerza una cadena en lugar de un número
# sustitución.
(( argv[$num] = $argv[$num] ))
print "$num> $argv[$num] "
hecho
psvar[1]=$num
mientras vared -cehp línea "${(%)ZCALCPROMPT}"; hacer
[[ -z $line ]] && break
# casos especiales
# Establecer la base predeterminada si `[#16]' o `[##16]', etc. . por sí solo.
# Desactívelo si `[#]' o `[##]'.
if [[ $line = (#b)[[:blank]. :]]#('[#'(\#|)(<->|)']')[[:blank:]]#(*) ]]; z $match[4] ]]; entonces
si [[ -z $match[3] ]]; entonces
defbase=
else p>
defbase=$coincidencia[
1]
fi
print -s -- $line
line=
continuar
else
base=$match[1]
fi
else
base=$defbase
fi p>
print -s -- $line
caso ${${line##[[:blank:]]#}%%[[:blank:]]#} en p>
q) # Salir si `q' está solo.
devuelve 0
;;
norma) # restaurar el formato de salida predeterminado
outform=1
;;
ciencia[[:blank:]]#(#b)(<->)(#B))
outdigits=$match[1]
outform=2
;;
arreglar[[:blank:]]#(# b)(<->)(#B))
outdigits=$match[1]
outform=3
;;
eng[[:blank:]]#(#b)(<->)(#B))
outdigits=$match[1]
outform=4
;;
local([[:blank:]]##*|))
eval $línea
línea=
continuar
;;
*)
# El último valor se almacena como una cadena, porque podría estar flotando
# punto o número entero --- no lo sabemos hasta después de la evaluación, y
# los arreglos siempre almacenan escalares de todos modos.
#
# Dado que es una cadena, será mejor que nos aseguremos de saber en qué
# base se encuentra, así que no cambies eso hasta que realmente la imprimamos.
eval "ans= \$(( $line ))"
# en caso de error $ans no está configurado; permite al usuario volver a editar la línea
[[ -n $ans ]] || continuar
argv[num++]=$ans
psvar[1]=$num
;;
esac
si [[ -n $base
]]; entonces
print -- $(( $base $ans ))
elif [[ $ans = *.* ]] ||
printf "$forms[outform]\n" $outdigits $ans
else
printf "%d\n" $ans
fi
line=
hecho
return 0
Admite punto decimal, + - * /, ok