Expansión Aritmética (Arithmetic Expansion) $(( ))

Mediante expansión podemos realizar operaciones aritméticas básicas de la siguiente manera:

$ $((operación))

En donde operación operación debe ser debe ser una combinación válida de valores enteros y operadores aritméticos, siendo soportadas las siguientes operaciones:

  • + Suma
  • – Resta
  • * Multiplicación
  • / División (La parte entera del cociente)
  • % Módulo de la división
  • ** Exponencial

Ejemplo: Multiplicar 5 por 4 y elevar el resultado al cubo:

$ echo $(( (5*4) ** 3 ))

La operación (5*4) debe ir entre paréntesis para asegurar que se haga dicha operación en primer lugar, ya que el exponencial tiene una mayor precedencia que la multiplicación. Sin los paréntesis el resultado de la operación sería 320 y no 8000 que es el resultado que estamos buscando.

Expansión de Fichero ó Nombre de Ruta (Pathname Expansion) * ? []

Este tipo de expansión hace uso de los comodines o wildcards (* ? [] ) para completar nombres de rutas o ficheros de la siguiente manera.

  • * Cualquier cadena de texto.
  • ? Al menos un carácter.
  • [..] Alguno de los caracteres indicados. Soporta secuencias del tipo [0-9] Aquí algunos ejemplos:

Listar todos los archivos pdf de un directorio: usamos el comodín * para que concuerde con cualquier cadena ya que no sabemos los nombres de los archivos que queremos listar, pero obviamente sabemos la extensión de ellos.

$ ls *.pdf

En este ejemplo listamos los archivos que comiencen por las letras A o B, seguido de al menos tres caracteres y luego cualquier cadena y que termine en la cadena mp3.

$ ls [AB]???*mp3

Aquí listamos los archivos .conf del directorio /etc que empiecen por la letras a o h. En mi debian Wheezy se listan los siguientes archivos que concuerdan con la expresión anterior: /etc/adduser.conf /etc/hdparm.conf /etc/host.conf

$ ls /etc/[ah]*conf

Expansión de Variables (Parameter Expansion) $

Mediante el carácter $ hacemos uso de esta expansión, que nos permite acceder a las variables de entorno, como lo es $USER que almacena el nombre de usuario de la sesión actual, también $HOME que guarda la ruta del home del usuario acutal. Para ver una lista de las variables disponibles podemos usar el comando printenv.

$ echo $USER

Nos imprime el nombre del usuario actual. Esta expansión no es casi usada en la linea de comandos, siendo más útil en programación de scripts.

Sustitución de Comandos (Command Subtitution) $( )

Podemos usar la salida de un comando como una expansión, lo voy a explicar con un ejemplo clásico: Cuando necesitamos compilar desde código fuente algún programa/driver en nuestro sistema necesitamos (al menos en debian) instalar dos paquetes para realizar dicha tarea: build-essential y el linux-headers. En cuanto a el segundo paquete son las cabeceras de la versión del kernel que estamos corriendo, y para saber dicha versión exacta usamos el comando uname -r, que en mi caso retorna 3.0.0-1-amd64. Usando lo anterior instalamos las cabeceras del kernel actual (junto con el paquete build-essential a menera de ejemplo):

# apt-get install build-essential linux-headers-$(uname -r)

Es como si escribiéramos el siguiente comando

# apt-get install build-essential linux-headers-3.0.0-1-amd64

Este tipo de expansión también puede ser realizada con las comillas invertidas

# apt-get install build-essential linux-headers-`uname -r`