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