Aprende leyendo en orden

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
De la comparación a la ramificación
[ "$count" -lt 5 ]exit code 0exit code 1bloque thenbloque elsesi es verdaderosi es falsoverdadero (0)falso (1)
[ ... ] devuelve el exit code 0 cuando es verdadero y 1 cuando es falso; if ejecuta then si es verdadero y else si es falso.
SyntaxSignificadoExample
[ "$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 ]

Escribe un script que reciba un número y una cadena como argumentos y ramifique según sus valores.

① Abre compare.sh con vi compare.sh, pulsa i para entrar en modo de inserción y escribe #!/bin/sh en la primera línea.

② Toma el primer argumento $1 como número, compruébalo con -lt contra algún valor e imprime un mensaje distinto cuando es menor y cuando no lo es.

③ Luego toma el segundo argumento $2 como cadena, compruébalo con = contra alguna palabra e imprime un mensaje distinto cuando coincide y cuando no.

④ Pulsa Esc, guarda con :wq, añade permiso de ejecución y luego ejecútalo con argumentos como ./compare.sh 3 dev.

⑤ Cambia los argumentos a ./compare.sh 8 prod y confirma que la rama tomada cambia.

⑥ Si no sabes qué escribir, copia el texto del panel de respuesta y pégalo en el modo de inserción de vi. (Ejecútalo correctamente para revelar la explicación.)

Linux console
0 / 3 completado(s)
Loading Linux Terminal...

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
Tipos de comprobaciones de archivo
la ruta a probar[ -f path ][ -d path ][ -e path ]true si esarchivo regulartrue si esdirectoriotrue siexistetipo de comprobaciónqué la hace verdadera
-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.
SyntaxSignificadoExample
[ -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

Escribe un script de comprobación que ramifique según si existen un archivo y una carpeta.

① Abre setup.sh con vi setup.sh, pulsa i para entrar en modo de inserción y escribe #!/bin/sh en la primera línea.

② Comprueba el archivo objetivo con [ -f ... ] e imprime que lo usas cuando existe, o que creas uno predeterminado cuando no existe.

③ Luego comprueba una carpeta de logs con [ -d ... ] e imprime un mensaje para cada caso.

④ Pulsa Esc, guarda con :wq y luego añade permiso de ejecución.

⑤ Ejecuta el script y confirma que se imprimen los resultados de la comprobación.

⑥ Si no sabes qué escribir, copia el texto del panel de respuesta y pégalo en el modo de inserción de vi.

Linux console
0 / 3 completado(s)
Loading Linux Terminal...

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)
flujo de if / elif / else
if [ A ]bloque Aelif [ B ]bloque Belsebloque de reservaverdaderofalsoverdaderofalsose comprueba de arriba abajosolo corre la primera rama verdadera
Empezando en if, prueba cada condición y ejecuta solo la primera rama que resulta verdadera. Si ninguna es verdadera, va a else.
SyntaxSignificadoExample
if cond; then … fise ejecuta cuando la condición es verdaderaif [ -f f ]; then echo ok; fi
theninicia el cuerpo cuando es verdaderoif [ -f f ]; then echo ok; fi
elif cond; then …prueba la siguiente cuando la anterior es falsaelif [ "$n" -lt 5 ]; then …
else …se ejecuta cuando ninguna es verdaderaelse echo other; fi
ficierra el ifif …; then …; fi

Escribe un script de comprobación que cambie su mensaje según un conteo.

① Abre check.sh con vi check.sh, pulsa i para entrar en modo de inserción y escribe #!/bin/sh en la primera línea.

② Prepara una variable que contenga un número, luego usa if / elif / else para imprimir mensajes distintos para -eq 0, para -lt un valor pequeño y para todo lo demás.

③ Pulsa Esc, guarda con :wq y luego añade permiso de ejecución.

④ Ejecuta el script y confirma qué rama toma.

⑤ Si no sabes qué escribir, copia el texto del panel de respuesta y pégalo en el modo de inserción de vi.

Linux console
0 / 3 completado(s)
Loading Linux Terminal...

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
enrutamiento con case
case "$action" instart)stop)*)start action ;;stop action ;;fallback ;;coincidencia de patrónacción coincidente (;;)
case compara el valor con los patrones desde arriba, ejecuta solo la primera rama coincidente y cierra con esac. *) es el caso sin coincidencia.
SyntaxSignificadoExample
case x in pat) … ;; esacenruta un valor a varios patronescase "$1" in start) … ;; esac
pat)un patrón comparado con el valorstart) echo go ;;
;;fin de la acción de cada casostart) echo go ;;
*)el caso sin coincidencia*) echo other ;;
esaccierra el casecase x in …; esac

Escribe un script de control que reciba un nombre de acción como argumento y enrute según su valor.

① Abre service.sh con vi service.sh, pulsa i para entrar en modo de inserción y escribe #!/bin/sh en la primera línea.

② Toma el primer argumento $1 como el nombre de la acción y, con case, enrútalo en tres patrones — start, stop y todo lo demás (*) — imprimiendo un mensaje distinto para cada uno. Termina cada rama con ;; y cierra con esac.

③ Pulsa Esc, guarda con :wq, añade permiso de ejecución y luego ejecútalo con un argumento como ./service.sh start.

④ Cambia el argumento a ./service.sh stop o ./service.sh restart y confirma que el patrón coincidente cambia.

⑤ Si no sabes qué escribir, copia el texto del panel de respuesta y pégalo en el modo de inserción de vi.

Linux console
0 / 3 completado(s)
Loading Linux Terminal...
QUIZ

Verificación de conocimientos

Responde cada pregunta una a una.

Pregunta 1¿Qué comprueba [ -f config.txt ]?

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?