terminal

Aprende shell script con ejemplos (IV)

Muchas veces con shell script necesitamos realizar cierto número de cálculos como contar los archivos de ciertos directorios, sumar el tamaño de ciertos ficheros, etc. Cuando hay que realizar cálculos complejos puedo utilizar bc pero en caso contrario puedo utilizar las facilidades que me da bash para hacer estos cálculos.

1. Usando bash como calculadora

Con bash podemos resolver expresiones aritméticas en nuestros script sin problemas siempre que no sean muy complejas (si son complejas mejor utilizar bc). Si por ejemplo queremos ejecutar lo siguiente en un script o en un terminal:

$ echo 1+1
1+1

El resultado es el que puedes ver. El intérprete de comandos bash lo entiende como si fuera una cadena y no va a mostrar nunca 2. Pero si hacemos lo siguiente:

$ echo $((1+1))
2

o si hacemos lo siguiente otro:

$ echo $[1+1]
2

Sí que funcionará. Siempre que trabajes con números enteros puede utilizar las expresiones anteriores. Lo dicho, para expresiones más complejas hay que utilizar bc.

2. El comando expr

El comando expr nos puede servir para realizar en shell script operaciones aritméticas. Veamos un ejemplo de cosas que se pueden realizar con este comando:

shell script comando expr

Como puedes ver en los ejemplos, los argumentos de expr se evalúan como expresiones y se escriben en la salida estándar que es la pantalla. Con expr podemos realizar operaciones aritméticas sencillas.

Recuerda:
Los argumentos o parámetros de expr tienen que ir separados por blancos para que expr los entienda.
Si por ejemplo hacemos RESULTADO=`expr $a + 1` ten en cuenta en no dejar en la asignación (=) ningún espacio en blanco.

Los argumentos de la orden expr se toman como expresiones y deben ir separados por blancos. La orden expr evalúa sus argumentos y escribe el resultado en la salida estándar. El uso mas común de la orden expr es para efectuar operaciones de aritmética simple.

Para multiplicar y dividir lo haremos de la siguiente manera:

$ expr 2 \* 2
4
$ expr 2 / 2
1

Y ya si queremos hacer cosas más complicadas tendremos que recurrir como hemos dicho al comando bc:

$ echo «scale=2; 10 / 3″|bc -l
3.33

En este caso divide 10 entre 3 y saca el resultado de la división con dos decimales.

Ejercicio propuesto.
Realiza un script que haga las operaciones básicas de una calculadora (suma, resta, multiplicación y división).

3. ¿Qué es el comando exit y el exit status?

Ya hemos visto en ejercicios anteriores cómo utilizar el comando exit para salir de un script de forma automatica.

Al igual que podemos hacer con los shell script, todo comando, cuando se ejecuta retorna un estado de salida también llamado return status o exit status. Un comando ejecutado con éxito por ejemplo retorna un valor de 0, mientras que un comando que ha dado error mostrará un valor distinto de 0 (error code) que generalmente es un número comprendido entre 0 y 255. Para ver el exit status de un comando basta con mostrar la variable $?.

Veamos esto con un ejemplo práctico. Este es el resultado de ejecutar varios comandos en una terminal:

shell script exit status

Como se puede ver, el exit status de un comando con respuesta normal es 0 y el de un comando inexistente da un valor de 127.

Imaginemos que tenemos el siguiente shell script:

#!/bin/bash
echo hola
exit 48

Si lo ejecuto en un terminal obtendré el siguiente resultado:

$ ./miniscript.sh
hola
$ echo $?
48

Esto es porque el comando exit 48 del script fuerza a que el exit status del mismo sea 48. Generalmente un exit status distinto de 0 indica cualquier tipo de problema o error. Si utilizas exit status en tus scripts ten en cuenta siempre esto.

Ejercicios propuestos:
1 Realiza un script que devuelva un valor 0 si se le introduce al menos un parámetro y 1 en caso contrario.
2 Realiza un segundo script para comprobar el exit status del primer script.

Si te ha gustado este post o lo has encontrado interesante no dejes de continuar aprendiendo shell script en la quinta entrega.

One thought on “Aprende shell script con ejemplos (IV)

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.