---
# System prepended metadata

title: Seminario II
tags: [Estudiantes, UAX]

---

###### 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`  
:::
    