Pregunta 1¿Qué comprueba [ -f config.txt ]?
Script de Shell - Condicionales
Comprueba archivos, cadenas y números con [ -f config.txt ], [ -z "$name" ] y [ "$count" -lt 5 ], ramifica con if / elif / else y enruta varios patrones con case — escribe y ejecuta cada script, ilustrado en una terminal del navegador.
Ramificar comparando valores — comparaciones de cadenas y números
En un script de shell cambias lo que se ejecuta comprobando si las cadenas coinciden o si los números son mayores.
Para la comprobación usas el comando test, o [ ... ], que hace lo mismo.
Los [ y ] necesitan espacios justo en su interior, así que escribes [ "$count" -lt 5 ].
Una comprobación verdadera devuelve el exit code 0 y una falsa devuelve 1.
Compara cadenas con = (igual) y != (distinto) y comprueba si está vacía con -z (vacío) o -n (no vacío).
Compara números con -eq (igual), -ne (distinto), -lt (menor que) y -gt (mayor que), y ten en cuenta que las cadenas y los números usan operadores distintos.
Envuelve las variables en comillas dobles como [ -z "$name" ] — así la sintaxis sigue siendo válida incluso cuando el valor está vacío.
count=3
mode="dev"
[ "$count" -lt 5 ] && echo small # 3 es menor que 5, así que small
[ "$count" -gt 0 ] && echo positive # mayor que 0, así que positive
[ "$mode" = "prod" ] || echo other # no es prod, así que other
[ -z "$mode" ] || echo has-mode # no está vacío, así que has-mode
[ ... ] devuelve el exit code 0 cuando es verdadero y 1 cuando es falso; if ejecuta then si es verdadero y else si es falso.| Syntax | Significado | Example |
|---|---|---|
[ "$a" = "$b" ] | verdadero si las cadenas a y b son iguales | [ "$mode" = "prod" ] |
[ "$a" != "$b" ] | verdadero si las cadenas a y b difieren | [ "$mode" != "dev" ] |
[ -z "$v" ] | verdadero si la variable v está vacía | [ -z "$name" ] && echo empty |
[ -n "$v" ] | verdadero si la variable v no está vacía | [ -n "$name" ] && echo set |
[ "$a" -eq N ] | verdadero si el número a es igual a N | [ "$count" -eq 0 ] |
[ "$a" -ne N ] | verdadero si el número a no es N | [ "$count" -ne 0 ] |
[ "$a" -lt N ] | verdadero si el número a es menor que N | [ "$count" -lt 10 ] |
[ "$a" -gt N ] | verdadero si el número a es mayor que N | [ "$count" -gt 0 ] |
Comprobar archivos y carpetas — -f / -d
En un script a menudo compruebas si existe un archivo de configuración o si una carpeta de salida está lista antes de seguir.
Comprueba un archivo con -f (existe un archivo regular) y una carpeta con -d (existe un directorio).
Cuando solo te importa que algo exista sin importar su tipo, usa -e, y para comprobar que no está vacío, usa -s.
Escribes estas comprobaciones con el mismo [ ... ] que para cadenas y números, pasando una ruta como [ -f config.txt ].
Devuelven el exit code 0 cuando es verdadero y 1 cuando es falso, así que combinadas con if o && / || puedes escribir una inicialización del tipo úsalo si existe, créalo si no.
touch report.txt # crea el material
[ -f report.txt ] && echo exists # el archivo existe, así que exists
[ -d report.txt ] || echo notdir # no es un directorio, así que notdir
mkdir logs # crea la carpeta
[ -d logs ] && echo hasdir # el directorio existe, así que hasdir
-f comprueba un archivo regular, -d un directorio y -e la existencia de cualquier tipo. La misma ruta puede dar resultados distintos según lo que preguntes.| Syntax | Significado | Example |
|---|---|---|
[ -f f ] | verdadero si f existe como archivo regular | [ -f config.txt ] && echo found |
[ -d d ] | verdadero si d existe como directorio | [ -d logs ] && echo dir |
[ -e p ] | verdadero si p existe, de cualquier tipo | [ -e data ] && echo there |
[ -s f ] | verdadero si f existe y no está vacío | [ -s log.txt ] && echo nonempty |
Dividir el flujo — if / elif / else
if ejecuta el bloque then solo cuando la condición es verdadera.
Para probar varias condiciones por turnos usa elif, para el caso en que ninguna coincide añade else y cierra con fi.
Separa las partes con punto y coma como en if condition; then action; fi, o divídelas en varias líneas.
count=3
if [ "$count" -eq 0 ]; then
echo "none"
elif [ "$count" -lt 5 ]; then
echo "few ($count)"
else
echo "many ($count)"
fi # imprime few (3)
if, prueba cada condición y ejecuta solo la primera rama que resulta verdadera. Si ninguna es verdadera, va a else.| Syntax | Significado | Example |
|---|---|---|
if cond; then … fi | se ejecuta cuando la condición es verdadera | if [ -f f ]; then echo ok; fi |
then | inicia el cuerpo cuando es verdadero | if [ -f f ]; then echo ok; fi |
elif cond; then … | prueba la siguiente cuando la anterior es falsa | elif [ "$n" -lt 5 ]; then … |
else … | se ejecuta cuando ninguna es verdadera | else echo other; fi |
fi | cierra el if | if …; then …; fi |
Enrutar varios patrones — case
Cuando comparas un valor con muchos candidatos, case se lee con más claridad.
Tiene la forma case value in pattern) action ;; esac, donde terminas cada patrón con ;; y capturas el caso sin coincidencia con *).
Deja la intención de la ramificación más clara que apilar muchos niveles de if.
action="start"
case "$action" in
start) echo "starting service" ;;
stop) echo "stopping service" ;;
*) echo "unknown action: $action" ;;
esac # imprime starting service
case compara el valor con los patrones desde arriba, ejecuta solo la primera rama coincidente y cierra con esac. *) es el caso sin coincidencia.| Syntax | Significado | Example |
|---|---|---|
case x in pat) … ;; esac | enruta un valor a varios patrones | case "$1" in start) … ;; esac |
pat) | un patrón comparado con el valor | start) echo go ;; |
;; | fin de la acción de cada caso | start) echo go ;; |
*) | el caso sin coincidencia | *) echo other ;; |
esac | cierra el case | case x in …; esac |
Verificación de conocimientos
Responde cada pregunta una a una.
Pregunta 2¿Qué palabra clave prueba otra condición cuando la anterior fue falsa?
Pregunta 3¿Qué símbolo marca el fin de la acción de cada patrón en case?