Quiero saber cuál es exactamente la diferencia entre
a=$[1+1]
a=$((1+1))
let a=1+1
a=$(expr 1 + 1 )
Los 4 asignan la variable a con 2, pero ¿cuál es la diferencia?
Por lo que descubrí hasta ahora, es que expr es más lento porque no es una construcción real de shell. Pero nada más que eso.
((...))
en realidad se puede usar para tareas enbash
,ksh
yzsh
:n=10; ((n+=10)); echo $n
imprime 20 e((x=1)); echo $x
imprime 1.let
El comando realiza una evaluación aritmética y es un shell incorporado.Ejecute este comando y no obtendrá nada (solo evalúa):
$(( ))
se utiliza para realizar expansión aritmética : lea aquíEjecute este y obtendrá un error (debido a la expansión):
$[ ]
es la sintaxis anterior para la expansión aritmética:expr
es un comando binario, si desea hacer una expansión aritmética dentro de una substitución de comando, puede usarlo:fuente
Dado que algunas de las respuestas anteriores mencionan específicamente
ksh93
, vale la pena señalar que puede hacer cálculos de coma flotante, por ejemplo:Puede controlar la precisión de la salida con printf, por ejemplo:
Al menos un argumento debe especificarse como un número de coma flotante como el anterior. Si ambos se especifican como enteros, entonces solo se realiza la matemática entera, por ejemplo:
Esto puede ser útil cuando necesita matemática de punto flotante en un script de shell, ya que puede evitar llamar a un comando externo.
fuente
zsh
respuesta . Dado queksh
ybash
son más similares entre sí (en general) que cualquiera de los doszsh
, me parece que unakh93
respuesta basada en esa pregunta podría ser bastante útil.let
no funciona en cron. Creo que se debe a quelet
tiene su propio entorno. Úselo$((...))
ya que es POSIX. Por ejemplo,en cron, da como resultado "x =", pero "x = 3" cuando se ejecuta desde el shell.
da como resultado "x = 3" en todos los casos.
fuente