Comparación de Cadenas y Valores Numéricos en Bash

Evaluación Aritmética con la Sintaxis (( ))

En el entorno de Bash, el uso de doble paréntesis (( ... )) está diseñado específicamente para opreaciones matemáticas y comparaciones de números enteros. Cuando se introducen cadenas de texto dentro de esta estructura, el intérprete intenta tratarlas como nombres de variables para obtener su valor numérico.

Si una cadena no corresponde a una variable definida o contiene caracteres no numéricos, Bash le asignará automáticamente el valor 0. Esto puede generar compotramientos inesperados si se intenta comparar texto puro.

# Ejemplo de comportamiento erróneo al usar aritmética para texto
verificar_estado() {
    # Si $1 es "CIERRE", Bash busca una variable llamada CIERRE. 
    # Al no existir, la evalúa como 0.
    # "APERTURA" también se evalúa como 0.
    if (( $1 == "APERTURA" )); then        
        echo "Iniciando proceso: $(date '+%H:%M:%S')"
    else
        echo "Finalizando proceso: $(date '+%H:%M:%S')"
    fi
}

# Al ejecutar la función con "CIERRE"
verificar_estado "CIERRE"

En el código anterior, la expresión interna se transforma en (( 0 == 0 )). Dado que esta igualdad es matemáticamente cierta, el resultado de la evaluación es 1 (verdadero), provocando que el script imprima siempre el mensaje de inicio, independientemente del argumento proporcionado.

Reglas de evaluación en (( )):

  • Cualquier resultado distinto de cero se considera verdadero.
  • var=10; (( var )) es verdadero (10).
  • (( 5 - 5 )) es falso (0).
  • Las cadenas de texto literales sin el prefijo de variable se interpretan como variables nulas (valor 0).

Comparación de Cadenas mediante [[ ]]

Para realizar comparaciones de texto, patrones o expresiones regulares de manera precisa, la estructura recomendada es el uso de corchetes dobles [[ ... ]]. A diferencia de la evaluación aritmética, esta sintaxis trata los operandos como literales de cadena a menos que se indique lo contrario.

# Implementación correcta para lógica de texto
verificar_estado() {
    local accion="$1"
    if [[ "$accion" == "APERTURA" ]]; then
        echo "Registro de inicio: $(date '+%F %T')"
    else
        echo "Registro de fin: $(date '+%F %T')"
    fi
}

# Ejecución de prueba
verificar_estado "APERTURA"
verificar_estado "CIERRE"

Al utilizar [[ ]], Bash realiza una comparación de caracteres bit a bit. Si el argumento $1 es "CIERRE", la condición "CIERRE" == "APERTURA" resultará falsa, permitiendo que el flujo del script se dirija correctamente hacia el bloque else. Esta es la forma estándar y segura de validar argumentos y variables de texto en scripts de automatización.

Etiquetas: bash shell-scripting linux-terminal Condicionales automatización

Publicado el 7-27 05:39