-->

Código de Salida, Test y Condicionales if/else

Objetivo:

Aprender a consultar el código de salida de un comando mediante $?, utilizar el comando test para comprobar la existencia de ficheros y directorios, y construir un script con la estructura condicional if/then/else/fi para tomar decisiones dentro de un programa.

Escenario:

  • Herramientas: Terminal de Linux, editor vi, un directorio scripts ya configurado en el PATH.
  • Conceptos clave: código de salida de un comando, la variable especial $?, el comando test y sus expresiones de tipo fichero, estructura condicional if/then/fi, cláusula else, uso de variables dentro de una condición.

Instrucciones:

Fase 1: Consulta del código de salida de un comando

  • Ejecuta un comando sencillo y consulta a continuación su código de salida:
  • ls
    echo $?
  • Ejecuta ahora un comando que provoque un error, por ejemplo un fichero inexistente:
  • ls fichero_que_no_existe
    echo $?
  • Compara ambos códigos y relaciona el valor 0 con una ejecución correcta.

Fase 2: Guardar el código de retorno en una variable

  • Ejecuta un script que ya tengas creado en tu carpeta de scripts:
  • contarficheros.sh
  • Guarda su código de salida en una variable:
  • resultado=$?
  • Consulta el valor almacenado:
  • echo $resultado

Fase 3: Comprobación de ficheros con el comando test

  • Comprueba si tu directorio personal existe y es un directorio:
  • test -d /home/tu_usuario
    echo $?
  • Repite la comprobación con una ruta que no exista:
  • test -d /home/ruta_inventada
    echo $?
  • Relaciona el valor 0 con el caso en que la condición se cumple y cualquier otro valor con el caso en que no se cumple.

Fase 4: Creación del script comprobardir.sh con if/then/fi

  • Crea un nuevo script:
  • vi comprobardir.sh
  • Entra en modo edición y escribe lo siguiente (ajusta la ruta a tu usuario):
  • #!/bin/bash
    if [ -d /home/tu_usuario ]
    then
        echo "el directorio existe"
    fi
  • Pulsa Esc y guarda con :x.

Fase 5: Permisos y primera ejecución

  • Da permisos de ejecución al script:
  • chmod +x comprobardir.sh
  • Ejecuta el script y comprueba que muestra el mensaje esperado:
  • comprobardir.sh

Fase 6: Comprobación con un directorio inexistente

  • Edita de nuevo el script y cambia la ruta por una que no exista.
  • Guarda y ejecuta el script:
  • comprobardir.sh
  • Observa que no aparece ningún mensaje, ya que todavía no se ha definido qué hacer cuando la condición no se cumple.

Fase 7: Incorporación de la cláusula else

  • Edita el script y añade una alternativa para cuando el directorio no exista:
  • #!/bin/bash
    if [ -d /home/tu_usuario ]
    then
        echo "el directorio existe"
    else
        echo "el directorio no existe"
    fi
  • Guarda y ejecuta el script con la ruta inexistente y comprueba que ahora sí aparece el mensaje de la rama else.
  • Consulta el contenido completo del script sin abrir el editor:
  • cat comprobardir.sh

Fase 8: Uso de una variable dentro de la condición

  • Edita el script para introducir una variable con la ruta a comprobar y utilízala tanto en la condición como en los mensajes:
  • #!/bin/bash
    directorio=/home/tu_usuario
    if [ -d $directorio ]
    then
        echo "el directorio $directorio existe"
    else
        echo "el directorio $directorio no existe"
    fi
  • Guarda y ejecuta el script, y comprueba que el mensaje incluye ahora el nombre del directorio comprobado.
  • Cambia el valor de la variable por una ruta inexistente, guarda y vuelve a ejecutar el script para comprobar el otro mensaje.

Preguntas de reflexión:

  1. ¿Qué rango de valores puede devolver un comando de Linux como código de salida?
  2. ¿Qué significa habitualmente que un comando devuelva el código 0?
  3. ¿Qué hace la variable especial $? y a qué comando hace referencia siempre?
  4. ¿Para qué sirve guardar el valor de $? en una variable propia?
  5. ¿Qué hace la opción -d del comando test? ¿Qué otras comprobaciones de fichero conoces?
  6. ¿Qué estructura tiene una condicional if en shell y qué palabra clave indica su final?
  7. ¿Qué ocurre si un script tiene un if/then/fi sin cláusula else y la condición no se cumple?
  8. ¿Para qué sirve la cláusula else dentro de una condicional?
  9. ¿Qué ventaja aporta utilizar una variable para el directorio en lugar de escribir la ruta directamente en la condición y en los mensajes?
  10. ¿Qué convención siguen la mayoría de los lenguajes de programación respecto a los valores true y false en las condiciones?
Haz clic aquí para ver las soluciones y explicaciones

1. ¿Qué rango de valores puede devolver un comando como código de salida?

Un comando puede devolver un valor entero comprendido entre 0 y 255.


2. ¿Qué significa que un comando devuelva el código 0?

Por convención, el código 0 indica que el comando se ha ejecutado correctamente, sin errores.


3. ¿Qué hace $??

Devuelve el código de salida del último comando ejecutado. Su valor cambia cada vez que se ejecuta un nuevo comando, por lo que siempre hace referencia al comando inmediatamente anterior.


4. ¿Para qué sirve guardar $? en una variable propia?

Porque el valor de $? se sobrescribe con cada nuevo comando ejecutado; guardarlo en una variable permite conservar ese resultado y utilizarlo más adelante en el script, incluso después de ejecutar otras instrucciones.


5. ¿Qué hace -d en test?

Comprueba si la ruta indicada existe y corresponde a un directorio. Otras comprobaciones habituales incluyen si el fichero existe, si es un fichero normal, si se puede leer, si se puede escribir, si es ejecutable o si es un enlace simbólico.


6. ¿Qué estructura tiene un if en shell?

Comienza con if seguido de una condición entre corchetes, continúa con then y los comandos a ejecutar si la condición se cumple, y finaliza siempre con la palabra clave fi.


7. ¿Qué ocurre sin cláusula else si la condición no se cumple?

Simplemente no se ejecuta ninguna acción: el script continúa sin mostrar ningún mensaje ni realizar ninguna operación asociada a ese caso.


8. ¿Para qué sirve else?

Permite definir una acción alternativa que se ejecuta cuando la condición evaluada en el if no se cumple.


9. ¿Qué ventaja aporta usar una variable para el directorio?

Permite cambiar la ruta a comprobar modificando un único lugar del script, evitando tener que buscar y actualizar la misma ruta repetida en varias partes del código, y además permite mostrarla dentro de los mensajes de salida.


10. ¿Qué convención siguen los lenguajes respecto a true y false?

De forma generalizada, un resultado de 0 se interpreta como verdadero (true), mientras que cualquier otro valor distinto de 0 se interpreta como falso (false).


Ficha de Laboratorio: Código de Salida, Test y Condicionales if/else

Instrucciones de entrega:

  1. Rellena los campos y responde en este formulario desde tu navegador.
  2. Pulsa el botón de imprimir al final de la página.
  3. Selecciona "Guardar como PDF" en el diálogo de impresión.
  4. Entrega el archivo PDF en el aula virtual.

Alumno/a:      Fecha:      

Grupo:


Completa la ficha realizando las siguientes actividades:

  1. Consulta el código de salida de un comando correcto y de uno que provoque un error.
    Escribe los comandos utilizados:

    Copia aquí los códigos de salida obtenidos:

    Explica qué indica cada uno de los dos valores obtenidos:
  2. Ejecuta un script propio y guarda su código de salida en una variable para consultarlo después.
    Escribe los comandos utilizados:

    Copia aquí el valor obtenido al consultar la variable:
  3. Utiliza el comando test para comprobar un directorio existente y otro inexistente.
    Escribe los comandos utilizados:

    Copia aquí los códigos de salida obtenidos en cada caso:
  4. Crea el script comprobardir.sh con la estructura if/then/fi, sin cláusula else, y pruébalo con un directorio que exista y otro que no.
    Copia aquí el contenido del script en esta primera versión:

    Explica qué ocurrió al ejecutarlo con el directorio inexistente:
  5. Añade la cláusula else al script y compruébalo de nuevo con ambos casos.
    Copia aquí el contenido completo del script con else:

    Copia aquí la salida obtenida en ambos casos:
  6. Modifica el script para utilizar una variable con la ruta del directorio, tanto en la condición como en los mensajes.
    Copia aquí el contenido final del script:

    Explica la ventaja de usar una variable en este caso: