Red de conocimiento informático - Material del sitio web - En Linux, use Shell para escribir una calculadora simple, que solo necesita realizar las cuatro funciones de suma, resta, multiplicación y división.

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.

# 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 $, por ejemplo,

# 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

# número de argumentos.

#

# 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. : -# es lo mismo que una línea que contiene solo `[#],

# de manera similar -##; establecen la base de salida predeterminada, con y sin p>

# 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

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

defbase=$coincidencia[

1]

fi

print -s -- $line

line=

continuar

else

base=$match[1]

fi

else

base=$defbase

fi

print -s -- $line

caso ${${line##[[:blank:]]#}%%[[:blank:]]#} en

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