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
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
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
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 ] # 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
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
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
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
- Falta un espacio:
[ "$a"="$b" ]es incorrecto, lo correcto es[ "$a" = "$b" ] - Variable sin comillas:
[ -f $file ]debería ser[ -f "$file" ] - 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
[ "$a" -eq "$b" ] && echo "verdadero" || echo "falso"