###### tags: `UAX` `Estudiantes` <font color = 'gray'> <p style="text-align:right;">Prof.: Laura J. Marcos-Zambrano </font> # Seminario II: Shell scripting ### Acceder al terminal: * Puedes usar la web [DistroSea](https://distrosea.com/select/ubuntu/) para probar Ubuntu online. * Puedes intalar un emulador de terminal como [GitBash](https://git-scm.com/book/es/v2/Ap%C3%A9ndice-A%3A-Git-en-otros-entornos-Git-con-Bash) o [Cywing](https://www.cygwin.com/). * Instalar Ubuntu en una máquina virtual siguiendo este [tutorial](https://hackmd.io/@laurichi13/H13G0jQes). * En Windows instalar la aplicación [Ubuntu(WLS)](https://learn.microsoft.com/es-es/windows/wsl/install) desde Microsfot Store. * Si ya tienes Ubuntu o Mac: Puedes buscar en <<Aplicaciones>> o acceder a través del teclado con las teclas **Ctrl+Alt+T** ## Comandos básicos: * El comando `echo` muestra en la terminal lo que escribes: ```bash=s echo "hola" ``` * Comando `pwd` Print Working Directory muestra el directorio actual ```bash=s pwd ``` * Comando `mkdir`Makes Directory: Crea una carpeta nueva ```bash=s mkdir laura ``` * Comando `cd` Changes Directory: Cambia de directorio. Movimiento entre carpetas (La tecla TAB ayuda a autocompletar) ```bash=s cd laura cd .. ``` * Comando `rm` Remove Directory: Elimina una carpeta. ```bash=s rmdir laura ``` > :warning: Una órden es una órden... El terminal no te pregunta si estas seguro de borrar una carpeta... Así que ¡cuidado! * comando `ls` List-directory Muestra el contenido del directorio ```bash=s ls # Lista completa ls -l # Ordenada por fecha de creación/edición ls -lt # Orden reverso order de creación/edición ls -ltr ``` :notebook: Siempre lee el manual de instrucciones, si no estas seguro de como actua un comando o quieres más información. ```bash=s ls --help mkdir --help ``` * Crear un archivo de texto vacío `touch` ```bash=s touch file1.txt ``` * Copiar un archivo o carpeta con el comando `cp`(Copy files) ```bash=s # Copiar archivo cp file1.txt file2.txt # Crear una carpeta nueva mkdir newFolder1 # Copiar newFolder1 newFolder2 cp -r newFolder1 newFolder2 ``` > :warning: -r significa recursive... es decir copia/mueve/borra la carpeta y todo el contenido. * Standard output el comando `>` permite guardar el output de cualquier comando en un archivo. ```bash=s # output en la pantalla ls -ltr # Output en un archivo de texto, ls -ltr > fileList.txt # El comando `nano` permite ver archivos de texto nano fileList.txt # Para que añada el output a un archivo existente sin sobreescribirlo ls -ltr >> fileList.txt ``` ## Actividad práctica :::info **Objetivos:** Manipular la terminal de Linux y reconocer comandos básicos. Diseñar un script sencillo usando el lenguaje bash. **Entrega:** Al final de cada bloque hay unas preguntas que debes responder y entregar como Tarea en el Aula Virtual. *La actividad puede hacerse en pareja* :dancers: ::: ### 1. Manipulación de archivos en la línea de comandos - Descarga estos archivos en tu ordenador: [sequence.fasta](https://drive.google.com/file/d/1rJLjfOmkzLUhVWbvGWrE3rBnoq7YgOgQ/view?usp=drive_link) y [sequence2.fasta](https://drive.google.com/file/d/1xiSq3M5M5xg-RhQK3cHG4TVY82ZV_L-q/view?usp=drive_link) - Abre el emulador de terminal de Linux (Gitbash) - Crea una carpeta de trabajo llamada "seminario1" ````bash=s mkdir seminario ```` - Vuelve a home ````bash=s cd .. ```` - Ve a la carpeta de descargas ````bash=s cd Downloads ```` - Mueve los archivos descargados ````bash=s mv sequence.fasta ~/seminario mv sequence2.fasta ~/seminario ```` - Ve a la carpeta seminario ````bash=s cd .. cd seminario ```` - Sigue las instrucciones: ````bash=s # Leer el archivo - para salir escribe q less sequence.fasta # Ver sólo las primeras diez líneas head sequence.fasta # Ver sólo las primeras 5 líneas head -n 5 sequence.fasta #Seleccionar una línea concreta de un fichero # Esta es la estructura: head -numLinea fichero | tail -1 . Se utiliza "|" para combianr comandos head -n 15 sequence.fasta | tail -1 #Ejemplo seleccionar línea numero 4 del fichero sequence.fasta (head -4 | tail -1) head -n 4 sequence.fasta | tail -1 # Ver sólo las últimas diez líneas tail sequence.fasta # Ver varios archivos cat sequence.fasta sequence2.fasta # Unir varios archivos en un archivo final cat sequence.fasta sequence2.fasta > merged.fasta # Ver el resultado less merged.fasta # 'q' para salir # Contar las palabras con `wc` wc sequence.fasta # Ver el número de líneas de un archivo wc -l sequence.fasta # Bucar patrones específicos con el comando `grep` # Todas las líneas que contengan ">" grep ">" merged.fasta # Que cuente las coincidencias grep -c ">" merged.fasta # Que empiece con "A"... grep "^A" merged.fasta # Que encuentre las líneas que contengan "ATG"... grep -n "ATG" merged.fasta #Si queremos que el contenido que estamos buscando se guarde en un archivo nuevo usar ">" grep ">" merged.fasta > resultado.txt ````` :::warning **Responde en un documento y entrega como Tarea en el Aula Virtual:** - ¿Cuál es la diferencia entre ejecutar? `echo "Hola" > saludo.txt ` y `echo "Adios" >> saludo.txt` (1 pto) - ¿Qué pasa si usas el comando `grep -v ">"` sobre los archivos fasta `sequence.fasta` y `sequence2.fasta` ? (1 pto) - ¿Qué obtenemos si usamos el comando `grep -v ">" sequence.fasta | wc -c` ? ¿A qué se corresponde? (3 ptos) - ¿Qué comando usarías para encontrar el patrón "CGAT" en el archivo `sequence2.fasta`? ¿Y para contar cuántas veces aparece? (2 ptos) ::: ### 2. Creación de un script ejecutable Ejemplo: Crear un script que al ejecutarse imprima el texto “Hola Mundo”. Paso 1: Abrir un editor de texto y crear un archivo llamado script.sh ``` nano saludo.sh ``` Paso 2: Escribir en el editor texto las líneas del script: #!/bin/bash echo "Hola mundo" >La primera línea: #!/bin/bash, es la directiva shebang que indica que el intérprete a utilizar es Bash. La siguiente línea es el comando 'echo', que se utiliza para imprimir texto en la salida estándar. En este caso, 'echo' imprime la cadena "Hola mundo". Paso 3: Hacer el script ejecutable, para ello escribimos el siguiente comando: ``` chmod +x saludo.sh ``` Paso 4: Ejecutamos el script escribiendo ./ y el nombre del script ``` $ ./saludo.sh ``` :::warning **Incluye en el documento de tarea y entrega como Tarea en el Aula Virtual:** - ¿Con qué comando podemos comprobar los permisos que tienen los archivos en un directorio? (1 pto) - ¿Qué diferencia hay entre los permisos del archivo `sequence.fasta` y `saludo.sh`? (2 ptos) ::: # Continuación Shell Scripting (Parte II) ### Actividad 1: Modifica el script `mi_script.sh `visto en clase para que haga lo siguiente: :::spoiler ``` #!/bin/bash echo "Hola $USER" echo "Hoy es: $(date)" echo "Tu directorio actual es: $(pwd)" echo "Los archivos en este directorio son:" ls ``` ::: * Pida al usuario su nombre con read. * Muestre un saludo personalizado: "Bienvenido, <nombre>". * Cree una carpeta nueva llamada practica_bash. ### Actividad 2: Crea un script llamado `renombrar.sh` que: * Cambie el nombre de los archivos sequnce.fasta y sequence2.fasta descagrgadops en la calse anterior y los llame seq.fasta y seq2.fasta. ### Actividad 3: Del siguiente script [script_con_errores.sh](https://drive.google.com/file/d/13dL4FxdEyF3xnc3bULQwYz0DLbclmM6p/view?usp=drive_link) * Abrir el archivo script_con_errores.sh. * Analizar cada línea y detectar los errores. * Corregir: * Comillas y variables mal escritas. * Comprobar rutas existentes o usar rutas relativas. * Añadir condición de salida al ciclo o eliminarlo. * Asegurarse de que el script tiene permisos de ejecución (chmod +x). * Ejecutar el script corregido y verificar que imprima el saludo, la fecha y los archivos correctamente. :::spoiler ``` #!/bin/bash echo "Hola $USERR echo 'Hoy es: $(date)' # Intento de listar archivos ls -l /directorio_que_no_existe # Ciclo infinito accidental while true echo "Este es un bucle" done ``` ::: :::warning **Incluye en el documento de tarea y entrega como Tarea en el Aula Virtual:** - Los tres scripts hechos: `mi_script.sh`, `renombrar.sh`, `script_corregido.sh` :::