Introducción
En el mundo de la administración de sistemas y el scripting de shell, contar con herramientas que permitan evaluar expresiones de forma rápida y fiable es esencial. El comando expr es una de esas utilidades clásicas que ha estado presente en los sistemas Unix y Linux durante décadas. Aunque hoy existen alternativas más potentes como la expansión aritmética de Bash ($(( ))) o bc, expr sigue siendo útil en entornos donde se requiere compatibilidad con shells POSIX o cuando se trabaja en scripts muy simples. Este post explica qué es expr, cómo se usa, qué tipos de expresiones puede manejar y cuáles son sus limitaciones, todo con ejemplos prácticos que puedes copiar y pegar en tu terminal.
¿Qué es expr?
El comando expr evalúa expresiones y escribe el resultado en la salida estándar. Fue diseñado originalmente para trabajar en el shell Bourne y sigue respetando el estándar POSIX. Puede manejar operaciones aritméticas enteras, comparaciones, operaciones lógicas y algunas manipulaciones de cadenas. Su sintaxis es bastante directa: se le pasa la expresión como argumentos separados por espacios y devuelve el resultado como texto. Si la expresión es inválida, expr devuelve un mensaje de error y un estado de salida distinto de cero.
Sintaxis básica
La forma general es:
expr EXPRESIÓN
Cada operador y operando debe estar separado por espacios. Por ejemplo, para sumar dos números se escribe expr 5 + 3. Los operadores aritméticos soportados son +, -, *, / y % (módulo). Es importante recordar que el asterisco (*) tiene significado especial para el shell, por lo que debe escaparse o entrecomillarse: expr 5 \* 3 o expr 5 '*' 3. Los operadores de comparación incluyen =, !=, <, <=, > y >=. Devuelven 1 si la condición es verdadera y 0 si es falsa. Los operadores lógicos son | (OR) y & (AND), también necesitando escape o comillas.
Ejemplos prácticos de operaciones aritméticas
- Suma:
expr 12 + 7devuelve19 - Resta:
expr 20 - 4devuelve16 - Multiplicación (con escape):
expr 6 \* 5devuelve30 - División entera:
expr 17 / 3devuelve5(el resto se descarta) - Módulo:
expr 17 % 3devuelve2 - Comparación:
expr 10 \> 5devuelve1(verdadero) - Comparación falsa:
expr 10 < 5devuelve0
Manipulación de cadenas con expr
Además de números, expr puede realizar operaciones básicas sobre cadenas. Estas son útiles cuando se necesita extraer subcadenas, obtener la longitud o buscar patrones dentro de una variable.
- Longitud de una cadena:
expr length "hola mundo"devuelve10(incluye el espacio) - Extraer subcadena:
expr substr "hola mundo" 1 4devuelvehola(empieza en posición 1, toma 4 caracteres) - Buscar un carácter:
expr index "hola mundo" "m"devuelve6(posición de la primera ‘m’) - Comparar cadenas:
expr "hola" = "hola"devuelve1;expr "hola" = "adios"devuelve0
En estos ejemplos es necesario usar comillas dobles alrededor de la cadena para que el shell no interprete espacios o caracteres especiales.
Combinar expr con otros comandos y estructuras de shell
El verdadero poder de expr se revela cuando se usa dentro de scripts o en combinación con tuberías y asignaciones de variables. Por ejemplo, para incrementar un contador dentro de un bucle while:
contador=0
while [ $contador -lt 10 ]; do
echo "Valor: $contador"
contador=$(expr $contador + 1)
done
O para validar que un argumento pasado a un script es un número positivo:
if [ $(expr match "$1" '[0-9][0-9]*') -eq 0 ]; then
echo "Error: se espera un número entero positivo"
exit 1
fi
Estos patrones muestran cómo expr puede integrarse en lógica de control y validación de entrada.
Limitaciones y consideraciones
Aunque expr es portátil y sencillo, tiene algunas restricciones que es bueno conocer:
- Solo trabaja con enteros. No soporta números de punto flotante; para esos se necesita
bcoawk. - El rendimiento es inferior a la expansión aritmética de Bash (
$(( ))) porque implica la creación de un proceso externo. - Algunos operadores, como el asterisco y el ampersand, requieren escape o comillas para evitar la interpretación del shell.
- No maneja expresiones complejas con paréntesis anidados de forma intuitiva; se deben usar múltiples llamadas o recurrir a otras herramientas.
En scripts modernos donde se garantiza Bash o Zsh, es preferible usar la sintaxis $(( expresión )) para operaciones aritméticas y [[ cadena =~ regex ]] para patrones. Sin embargo, expr sigue siendo valioso cuando se necesita máxima portabilidad entre shells POSIX.
Conclusión
El comando expr es una herramienta clásica, sencilla y portátil para evaluar expresiones aritméticas y de cadena en el entorno de shell de Linux. Aunque ha sido parcialmente sustituido por sintaxis más modernas, su presencia en prácticamente todas las distribuciones lo convierte en un recurso confiable para scripts que deben ejecutarse en sistemas mínimos o en entornos restringidos. Con los ejemplos mostrados puedes comenzar a usar expr hoy mismo para tareas de cálculo, validación y manipulación de texto, y decidir cuándo es más adecuado que otras alternativas.


