LLevo algún tiempo sin escribir en el blog, y tengo un par de entradas que he publicado en otro sitio (universo emergya) y me gustaría tenerlas en mi blog, no porque no haya "literatura" en google al respecto, sino para futuras consultas. En concreto son dos pequeñas pinceladas de bash script que me han hecho falta recientemente. En esta entrada está la primera de ellas: Operaciones aritméticas básicas en bash.
Las formas más conocidas para realizar operaciones aritméticas con bash son mediante los comandos let y expr. Ambas expresiones pueden ser un tanto "pijoteras" en cuanto a sintaxis y el otro día trasteando por ahí encontré una forma a mi juicio bastante más sencilla.
Forma tradicional con let editamos un fichero llamado prueba1 con algún editor de texto:
Ejecutamos prueba1
Las formas más conocidas para realizar operaciones aritméticas con bash son mediante los comandos let y expr. Ambas expresiones pueden ser un tanto "pijoteras" en cuanto a sintaxis y el otro día trasteando por ahí encontré una forma a mi juicio bastante más sencilla.
Forma tradicional con let editamos un fichero llamado prueba1 con algún editor de texto:
#!/bin/bash
CONTADOR=0
while [ $CONTADOR -lt 10 ]; do
echo "Contador vale: $CONTADOR"
let "CONTADOR += 1"
done
Ejecutamos prueba1
$ chmod +x prueba1
$ ./prueba1
Contador vale: 0
Contador vale: 1
Contador vale: 2
Contador vale: 3
Contador vale: 4
Contador vale: 5
Contador vale: 6
Contador vale: 7
Contador vale: 8
Contador vale: 9
En la expresión superior, se inicializa CONTADOR a 0, y mientras contador sea menor que 10, se imprime "Contador vale: " y lo que valga la variable en cada nueva entrada del bucle. Tras imprimir el valor, mediante let le suma una unidad a la variable CONTADOR (la expresión con let, significa CONTADOR = CONTADOR + 1) aunque matemáticamente se lea como algo imposible puesto que sería X = X + 1, el '=' no hay que leerlo como una igualdad, sino como una asignación, es decir, se le asigna a lo que se sitúa a la izquierda del '=' lo que hay a la derecha de este. En este tipo de expresiones, primero se calcula lo que hay a la derecha para asignárselo a la variable que hay a la izquierda. El con el comando anterior (chmod) le damos permisos de ejecución al script.
Con expr: prueba2:
Forma alternativa: prueba3Con expr: prueba2:
#!/bin/bash
CONTADOR=0
while [ $CONTADOR -lt 10 ]; do
echo "Contador vale = $CONTADOR"
CONTADOR=$(expr $CONTADOR + 1)
done
La ejecución producirá una salida idéntica a la anterior, pero esta vez en lugar de usar let hemos usado expr:
$ chmod +x prueba2
$ ./prueba2
Contador vale = 0
Contador vale = 1
Contador vale = 2
Contador vale = 3
Contador vale = 4
Contador vale = 5
Contador vale = 6
Contador vale = 7
Contador vale = 8
Contador vale = 9
#!/bin/bash
CONTADOR=0
while [ $CONTADOR -lt 10 ]; do
echo "Contador vale = $CONTADOR"
CONTADOR=$((CONTADOR + 1))
done
Como vemos, la ejecución de este script produce la misma salida que los anteriores, pero no se está usando ni let ni expr para hayar la suma de CONTADOR:
y devolverá lo mismo que los anteriores:
Este script si lo ejecutamos devolvería:
$ chmod +x prueba3
$ ./prueba3
Contador vale = 0
Contador vale = 1
Contador vale = 2
Contador vale = 3
Contador vale = 4
Contador vale = 5
Contador vale = 6
Contador vale = 7
Contador vale = 8
Contador vale = 9
Esta última forma, permite usar '$' o no dentro de la expresión para la obtener el valor de la variable.
También se puede poner sin espacios, es decir, el siguiente script también es correcto: prueba3-b
También se puede poner sin espacios, es decir, el siguiente script también es correcto: prueba3-b
#!/bin/bash
CONTADOR=0
while [ $CONTADOR -lt 10 ]; do
echo "Contador vale = $CONTADOR"
CONTADOR=$(($CONTADOR+1))
done
y devolverá lo mismo que los anteriores:
$ chmod +x prueba3-b
$ ./prueba3-b
Contador vale = 0
Contador vale = 1
Contador vale = 2
Contador vale = 3
Contador vale = 4
Contador vale = 5
Contador vale = 6
Contador vale = 7
Contador vale = 8
Contador vale = 9
Por último señalar que también permite el uso de otros operadores como son división, módulo (resto de la división) y potencia:
#!/bin/bash
CONTADOR=4
echo "Inicalizamos contador = $CONTADOR"
CONTADOR=$((CONTADOR**5))
echo "Contador elevado a la quinta, 4 elevado a 5 = $CONTADOR"
CONTADOR=$((CONTADOR%5))
echo "Resto de dividir el contador por 5 = $CONTADOR"
CONTADOR=$((9/3))
echo "Contador es igual a resultado de la división 9/3 = $CONTADOR"
Este script si lo ejecutamos devolvería:
$ chmod +x prueba
$ ./prueba
Inicalizamos contador = 4
Contador elevado a la quinta, 4 elevado a 5 = 1024
Resto de dividir el contador por 5 = 4
Contador es igual a resultado de la división 9/3 = 3
Personalmente esta forma de hacer operaciones en bash, me parece más legible, con menos texto que las anteriores, y más fácil de recordar la sintaxis por lo que es la que uso actualmente.
No hay comentarios:
Publicar un comentario