Una expresión es una combinación de valores y operaciones que, al ser evaluados, entregan un valor.
El interprete bash soporta una gran variedad de expresiones en el desarrollo de programas, aquí veremos dichas expresiones.
1) Expresiones aritméticas:
A la hora de escribir un programa siempre se precisa de operaciones matemáticas básicas o complejas.
Aquí tenemos una lista de operaciones aritméticas:
Var++: Post-incremento de variable.
Var--: Post-decremento de la variable.
++Var: Pre-incremento de variable.
--Var: Pre-decremento de la variable.
+Expr: Más, numero positivo
-Expr: Menos, numero negativo
! Expr: Negación lógica
~ Expr: Negación binaria.
E1 ** E2 Exponente. E1 elevado a la E2.
E1 * E2: Multiplicación
E1 / E2: División.
E1 % E2: Resto.
E1 + E2: Suma
E1 – E2: Resta.
Expr << N: Desplazamiento binario a la izquierda un numero (N) de veces.
Expr >> N: Desplazamiento binario a la derecha un numero (N) de veces.
E1 < E2: Menor que
E1 > E2: Mayor que
E1 <= E2: Menor o igual que
E1 >= E2: Mayor o igual que
E1 = E2: Igualdad.
E1 != E2: Desigualdad.
E1 & E2: Operación binaria Y
E1 ^ E2: Operación binaria O exclusiva
E1 | E2: Operación binaria O
E1 && E2: Operación lógica Y
E1 || E2: Operación Binaria O
E1 ? E2 : E3 Evaluación Lógica Si E1=cierto, devuelve E2; si no, E3
E1 Op= E2: Asignación normal con pre-operación.(*=, /=, %=, +=, -=, <<=, >>=, &=, ^ =, !=) Funciona como E1 = E1 Op E2
E1, E2: Operaciones independientes. Se ejecutan en orden.
Veamos ahora como podemos utilizar algunos operadores aritméticos para realizar algunas operaciones matemáticas básicas: suma resta multiplicación división y módulos.
Comando expr.
expr 10 + 2
#Resultado 12
expr 10 - 2
#Resultado 8
expr 10 * 2
#Resultado 20
expr 10 / 2
#Resultado 5
expr 10 % 2
#Resultado 0
También podemos hacerlo utilizando el comando echo de la siguiente manera:
echo $((10+2))
#Resultado 12
echo $((10-2))
#Resultado 8
echo $((10*2))
#Resultado 20
echo $((10/2))
#Resultado 5
echo $((10%2))
#Resultado 0
Nota: Los comandos expr y echo solo admiten y devuelven enteros, Es importante utilizar espacios para las operaciones con expr, notese la diferencia en el siguiente ejemplo
expr 2+2 #todo pegado
#devuelve 2+2
expr 2 + 2 #con espacios
#devuelve 4
Al utilizar el asterisco * para una operación de multiplicación con el comando expr es importante hacerlo con una barra invertida, si no, nos da error. Ejemplo
expr 2 * 5
#devuelve error
expr 2 * 5 #la barra invertida va antes del * pero aquí no se visualiza
#devuelve 10
otra manera de realizar estas operaciones es con bc que es una potente calculadora que viene instalada en muchas distribuciones GNU/Linux. Par usar bc tenemos dos formas:
bc
abre la calculadora.
Colocas la operación que necesitas realizar
5*5
Al pulsar enter te devolverá el resultado en este caso:
25
quit
con quit salimos.
La otra manera es la siguiente:
echo "5*5" | bc -l
#Resultado 25
En este contexto la segunda manera de usar bc nos podría resultar útil pues como ya sabemos es posible guardar salidas de comandos en variables por ejemplo
$var=$(echo "6*8" | bc -l)
echo $var
#Resultado 48
Veamos ahora un par de ejemplos.
#! /bin/bash
clear
echo "Operaciones Matemáticas"
read -p "Ingresa el primer valor " val1
read -p "ingresa el operador bien sea + - / o * " opr
read -p "Ingresa el segundo valor " val2
echo "Estamos procesando"
sleep 2
res=$(echo "$val1$opr$val2" | bc -l)
echo $res
Explicación:
Como asumo que ya se han leído los dos tutoriales anteriores solo diré, de las lineas 4, 5 y 6 que pedimos los valores que usaremos y los guardamos en variables, el comando sleep sirve para detener un poco la ejecución del script para dar la sensación de que nuestro “Complejisimo programa calculadora esta leyendo miles de lineas de código para dar un resultado” XD por ultimo guardamos en una variable $res el comando para realizar la operación con bc e imprimimos la variable $res
Una manera mas sencilla pero mas eficaz pues nos permitirá realizar operaciones mas complejas seria:
#! /bin/bash
clear
echo "Operaciones Matemáticas"
read -p "Ingresa tu operación " opr
echo "Estamos procesando"
sleep 2
echo "$opr" | bc -l
con este código podríamos ingresar directamente operaciones como (2*2)*(5*5)-99 y arrojaría 1 como resultado.
2) Expresiones Condicionales
Las expresiones condicionales son evaluadas por los mandatos internos del tipo test, dando como resultado un valor de cierto o de falso. Suelen emplearse en operaciones condicionales y bucles, aunque también pueden ser empleadas en órdenes compuestas.
Podemos dividir las expresiones condicionales en varios tipos según el tipo de parámetros o su modo de operación:
Expresiones con ficheros: que comprueba la existencia, el tipo, los permisos o la facha de archivos o directorios.
Expresiones comparativas numéricas que evalúan la relación de orden numérico entre los parámetros.
Expresiones comparativas de cadenas que establecen la relación de orden alfabético entre los parámetros.
a) Expresiones de ficheros.
Son expresiones condicionales que devuelven el valor de cierto si se cumple la condición especificada; en caso contrario da un valor de falso. Hay una gran variedad de expresiones relacionadas con fichero
lista de expresiones
-e Fich: El fichero existe
-s Fich: El fichero esta vacío
-f Fich: Es un Fichero Normal
-d Fich: Es un directorio
-b Fich: Es un dispositivo de bloques
-c Fich: Es un dispositivo de caracteres
-p Fich: Es una tubería
-h Fich:
-L Fich: Es un enlace simbólico
-S Fich: Es un socket de comunicaciones.
-t Fich: El descriptor esta asociado a una terminal
Fich1 -ef Fich2: Los dos ficheros son enlaces hacia el mismo archivo
La siguiente lista de condiciones de permiso comprueban si el usuario que realiza la comprobación puede ejecutar la operación deseada sobre determinado fichero.
-r Fich: Permiso de lectura
-w Fich: Permiso de escritura
-x Fich: Permiso de ejecución
-u Fich: Permiso SUID
-g Fich: Permiso SGID
-t Fich: Permiso de directorio compartido o fichero en cache
-O Fich: es el propietario del archivo
-G Fich: El usuario pertenece al grupo con el GID del fichero
Ahora los operadores relacionados a las fechas
-N Fich: El fichero ha sido modificado desde la ultima lectura
Fich1 -nt Fich2: El Fich1 es mas nuevo que el Fich2
Fich1 -ot Fich2: El Fich1 es mas antiguo que el Fich2
b) Expresiones comparativas numéricas:
Aunque ya vimos los operadores de comparación numérica con las expresiones aritméticas a continuación daremos una lista de operadores ara este formato.
N1 -eq N2: Igual
N1 -ne N2: Diferente
N1 -lt N2: Menor que
N1 -gt N2: Mayor que
c) Expresiones comparativas de cadenas:
A continuación los formatos
Cad1 = Cad2: Igual
Cad1 != Cad2: Diferente
[-n] Cad: La cadena no esta vacía, su longitud no es 0
-z Cad: La longitud de la cadena es 0
El uso de estos los operadores condicionales los veremos más adelante en esta serie de tutoriales por ahora los dejamos en teoría teniendo en cuenta que es importante conocer detalles de este tipo pues aveces sucede que saltamos de variables a funciones y cuando venimos a ver no sabemos ni como hacer una suma y toca regresar.
Espero que les sea útil

