Comando Shell test

testEl comando es una herramienta integrada de Shell para evaluación de condiciones, que evalúa expresiones y devuelve un valor booleano (verdadero/falso). Normalmente se usa junto conifdeclaraciones, y es la base para implementar control lógico en scripts de Shell.

El comando test en Shell se utiliza para comprobar si una condición se cumple. Puede realizar pruebas en tres aspectos: numérico, cadenas y archivos.

Formato de sintaxis

test EXPRESSION
# o 
[ EXPRESSION ]  # 注意方括号内必须有空格

Operaciones de prueba de archivos

testEl comando se usa más comúnmente para verificar atributos de archivos. A continuación se muestran las opciones comunes de prueba de archivos:

Operador Descripción Ejemplo
-e Si el archivo existe [ -e file.txt ]
-f Es un archivo regular [ -f /path/to/file ]
-d Es un directorio [ -d /path/to/dir ]
-r Legible [ -r file.txt ]
-w Escribible [ -w file.txt ]
-x Ejecutable [ -x script.sh ]
-s Tamaño del archivo >0 [ -s logfile ]
-L Es un enlace simbólico [ -L symlink ]

Script de ejemplo:

Ejemplo

#!/bin/bash

file="/etc/passwd"

if [ -e "$file" ]; then
    echo "$fileexiste"
    if [ -r "$file" ]; then
        echo "y es legible"
    fi
else
    echo "$fileno existe"
fi

El resultado de salida es:

/etc/passwd 存在
并且可读

Comparación de cadenas

testProporciona varias formas de comparación de cadenas:

Operador Descripción Ejemplo
-z STRING La cadena está vacía [ -z "$var" ]
-n STRING La cadena no está vacía [ -n "$var" ]
STRING1 = STRING2 Las cadenas son iguales [ "$var1" = "$var2" ]
STRING1 != STRING2 Las cadenas son diferentes [ "$var1" != "$var2" ]

Nota importante: Las variables de cadena siempre deben estar entre comillas dobles para evitar errores de sintaxis causados por variables vacías.

Ejemplo:

Ejemplo

#!/bin/bash

read -p "Ingrese el nombre de usuario: " username

if [ -z "$username" ]; then
    echo "Error: el nombre de usuario no puede estar vacío"
    exit 1
elif [ "$username" = "root" ]; then
    echo "Advertencia: no se recomienda usar la cuenta root"
else
    echo "Bienvenido,$username"
fi

Después de ejecutar, escribimos ejemplo en la terminal, y el resultado de salida es similar a:

输入用户名: ejemplo
欢迎, ejemplo

Comparación numérica

Para la comparación numérica,testse utilizan diferentes operadores:

Operador Descripción Ejemplo
-eq Igual a [ "$a" -eq "$b" ]
-ne No igual a [ "$a" -ne "$b" ]
-gt Mayor que [ "$a" -gt "$b" ]
-ge Mayor o igual que [ "$a" -ge "$b" ]
-lt Menor que [ "$a" -lt "$b" ]
-le Menor o igual que [ "$a" -le "$b" ]

Ejemplo:

Ejemplo

#!/bin/bash

read -p "Ingrese la edad: " age

if [ "$age" -lt 0 ]; then
    echo "La edad no puede ser negativa"
elif [ "$age" -lt 18 ]; then
    echo "Menor de edad"
elif [ "$age" -ge 18 ] && [ "$age" -lt 60 ]; then
    echo "Adulto"
else
    echo "Persona mayor"
fi

Después de ejecutar, escribimos 12 en la terminal, y el resultado de salida es similar a:

输入年龄: 12
未成年人

Operadores lógicos

testAdmite combinaciones lógicas:

Operador Descripción Ejemplo
! Negación lógica (NOT) [ ! -f "$file" ]
-a AND lógico [ "$a" -eq 1 -a "$b" -eq 2 ]
-o OR lógico [ "$a" -eq 1 -o "$b" -eq 2 ]

Forma moderna recomendada: use&&y||en lugar de-ay-o, que es más compatible con el estándar POSIX:

Ejemplo

[ "$a" -eq 1 ] && [ "$b" -eq 2 ]  # AND
[ "$a" -eq 1 ] || [ "$b" -eq 2 ]  # OR

Uso avanzado: [[ ]] y (( ))

Bash proporciona una sintaxis de prueba más potente:

Doble corchete [[ ]]

  • Admite coincidencia de patrones:[[ "$var" == *.txt ]]
  • Admite expresiones regulares:[[ "$var" =~ ^[0-9]+$ ]]
  • Manejo de cadenas más seguro

Comparación aritmética (( ))

  • Diseñado específicamente para comparación numérica:(( a > b ))
  • Admite expresiones aritméticas más complejas

Ejemplo:

Ejemplo

if [[ "$file" == *.log ]]; then
    echo "Este es un archivo de registro"
fi

if (( $count > 10 )); then
    echo "La cantidad supera 10"
fi

Ejemplos de aplicación práctica

1. Verificar si el servicio está en ejecución

Ejemplo

#!/bin/bash

service="nginx"

if systemctl is-active --quiet "$service"; then
    echo "$serviceen ejecución"
else
    echo "$serviceno en ejecución"
    # Puede agregar el comando para iniciar el servicio
fi

2. Verificación de archivos de respaldo

Ejemplo

#!/bin/bash

backup_file="/backups/data_$(date +%Y%m%d).tar.gz"

if [ ! -f "$backup_file" ]; then
    echo "Error: el archivo de respaldo$backup_fileno existe"
    exit 1
elif [ ! -s "$backup_file" ]; then
    echo "Advertencia: el archivo de respaldo está vacío"
else
    echo "Verificación de respaldo exitosa"
fi

Errores comunes y consejos de depuración

  1. Falta un espacio:[ "$a"="$b" ]es incorrecto, lo correcto es[ "$a" = "$b" ]
  2. Variable sin comillas:[ -f $file ]debería ser[ -f "$file" ]
  3. Confundir la comparación de cadenas y la numérica: use=para comparar cadenas,-eqpara comparar valores numéricos

Consejo de depuración: agregue al inicio del scriptset -xpara activar el modo de depuración, o useechopara imprimir la expresión de prueba:

Ejemplo

echo "Expresión de prueba: [$a -eq $b ]"
[ "$a" -eq "$b" ] && echo "verdadero" || echo "falso"
Otras extensiones