Como todo es un archivo en Linux, todo es una cadena en bash.
¡Sí! Técnicamente, no hay tipos de datos en Bash. Esencialmente, las variables de Bash son solo cadenas de caracteres.
Y eso crea un problema cuando intentas hacer operaciones aritméticas en bash. Los números que intentas sumar te dan resultados extraños.
[email protected]:~$ sum=3+6
[email protected]:~$ echo $sum
3+6
Para convertir cadenas en números enteros en bash, envuélvalos en $((X)). Así:
$((string))
Si la cadena tiene un número identificable, se tratará como un número. El ejemplo que mostré arriba se puede corregir como:
[email protected]:~$ sum=$((3+6))
[email protected]:~$ echo $sum
9
Cualquier cosa que haga dentro de $((...)) se considera una operación aritmética. Veamos la conversión de cadenas en números con un poco más de detalle para que pueda usar cálculos aritméticos en bash.
Convertir variables de cadena en números
Declaremos algunos "números" que son básicamente cadenas de caracteres.
[email protected]:~$ a=11
[email protected]:~$ b=3
Puede consultar el número asignado:
[email protected]:~$ echo $a
11
[email protected]:~$ echo $b
3
Ahora intentemos sumar ambos números y almacenar el valor en una tercera variable c
:
[email protected]:~$ c=$a+$b
[email protected]:~$ echo $c
11+3
Como puede ver en el resultado anterior, c también se trata como una cadena.
Para que la suma sea exitosa, debe "convertirla" a través de una expansión aritmética:
[email protected]:~$ c=$(($a+$b))
[email protected]:~$ echo $c
14
Tenga en cuenta que c
sigue siendo en realidad una cadena, hasta que implícitamente usas la misma expansión aritmética nuevamente para otra operación que discutiré en un rato.
[email protected]:~$ c=$((5))
Lo anterior es equivalente a:
[email protected]:~$ c=5
Usemos una tercera variable d
para otra operación:
[email protected]:~$ d=10
Todas estas declaraciones implícitas siguen siendo cadenas. Es igual a como había definido a
y b
antes.
Ahora para la segunda operación:
[email protected]:~$ e=$(($a+$b*$c-$d))
[email protected]:~$ echo $e
16
En la expresión anterior, primero se calcula el producto de b y c y finalmente sigue la suma y la resta.
Como mencioné anteriormente, cualquier cosa que haga entre $((...)) se considera una operación aritmética.
Toda esta conversión funciona para números enteros. No funcionará con puntos flotantes, es decir, números con puntos decimales.Intente mezclar cadenas y números reales
Mezclar cadenas y números enteros sigue siendo más seguro que mezclar coca cola y menta. Sin embargo, produce un resultado extraño.
[email protected]:~$ sum=$((3+hello))
[email protected]:~$ echo $sum
3
Solo funcionará cuando haya números (como una cadena). Si es una cadena de caracteres pura, no se convertirá mágicamente en algunos números. En cambio, se ignora como puede ver en el ejemplo anterior.
Método alternativo:usar expr
También puede usar expr
herramienta para hacer la evaluación, pero tenga en cuenta que no es un procedimiento Bash "nativo", ya que necesita tener coreutils
instalado (por defecto en Ubuntu) como un paquete separado.
[email protected]:~$ expr $a + $b \* $c - $d
16
Espero que este pequeño y rápido tutorial te haya ayudado a evaluar las cadenas bash como números. Si tiene preguntas o sugerencias, no dude en dejar un comentario a continuación.