04 Scripts Bash
04 Scripts Bash
Curso Unix
Scripts de bash
Variables
Nombre de las variables
Control de flujo
Bucles (for)
Condicionales (if)
Condicionales con números
Condicionales con cadenas de texto
Condicionales con archivos
Manipulación de cadenas de texto
Extraer subcadena
Borrar subcadena
Reemplazar subcadena
Operaciones aritméticas
Parallel
Ejercicios
En esta sección del curso vamos a aprender a hacer algunos scripts básicos que nos
permitan automatizar y acelerar el trabajo. Un script no es más que un archivo que contiene
un conjunto de órdenes para realizar una acción.
Vamos a crear nuestro primer script. Para ello en un editor de texto escribiremos lo siguente
y lo guardaremos con el nombre *hola.sh *
#!/bin/bash
# Este es nuestro primer progrma
echo Hola Mundo
~$ ./hola.sh.
La primera línea de nuestro script le indica al sistema que tiene que usar la shell BASH. La
segunda línea es un comentario para consumo humano, todas las líneas que comiencen por
# son ignoradas por la máquina y nos sirven para incluir comentarios destinados a
programadores o usuarios. En la tercera línea tenemos el comando echo que sirve para
imprimir texto en la pantalla.
Variables
Como cualquier otro lenguaje de programación, necesitamos variables que nos servirán
para guardar datos en la memoria del ordenador hasta el momento que los necesitemos.
Podemos pensar en una variable como una caja en la que podemos guardar un elemento
(e.g, un número, una cadena de texto, la dirección de un archivo…) y, siguiendo con el símil,
la memoria del ordenador no sería más que el conjunto de esas cajas.
Para asignar el valor a una variable simplemente simplemente debemos usar el signo = :
nombre_variable=valor_variable
Para recuperar el valor de dicha variable sólo hay que anteponer el símbolo de dolar $
antes del nombre de la variable:
$nombre_variable
#!/bin/bash
to_print='Hola mundo'
echo $to_print
to_print=5.5
echo $to_print
https://bioinf.comav.upv.es/courses/unix/scripts_bash.html 2/10
1/7/2020 Scripts de bash
De manera general, y para evitar problemas con las variables de entorno que siempre están
escritas en mayúscula, deberemos escribir el nombre de las variables en minúscula.
Control de flujo
Como hemos visto los scripts se ejecutan línea a línea hasta llegar al final, sin embargo,
muchas veces nos interesará modificar ese comportamiento de manera que el programa
pueda responder de un modo u otro dependiendo de las cirscunstancias o pueda repetir
trozos de código.
En este curso nos vamos a centrar en los controles de flujo más importantes:
Bucles (for)
La sintaxis general de los bucles es la siguiente:
https://bioinf.comav.upv.es/courses/unix/scripts_bash.html 3/10
1/7/2020 Scripts de bash
COMANDO 2
...
COMANDO N
done
Hay que tener en cuenta que si pasamos un listado de valores pero lo ponemos
entrecomillado, el ordenador lo enterá como un única línea:
#!/bin/bash
for numero in {1..20..2};
do
echo Este es el número: $numero
done
Condicionales (if)
La sintaxis básica de un condicional es la siguiente
if [[ CONDICIÓN ]];
then
COMANDO 1 si se cumple la condición
fi
if [[ CONDICIÓN ]];
then
COMANDO 1 si se cumple la condición
https://bioinf.comav.upv.es/courses/unix/scripts_bash.html 4/10
1/7/2020 Scripts de bash
else
COMANDO 2 si no se cumple la condición
fi
if [[ CONDICIÓN 1 ]];
then
COMANDO 1 si se cumple la condición 1
elif [[ CONDICIÓN 2 ]];
then
COMANDO 2 si se cumple la condición 2
else
COMANDO 3 si no se cumple la condición 2
fi
operador significado
-lt menor que (<)
-gt mayor que (>)
-le menor o igual que (<=)
-ge mayor o igual que (>=)
-eq igual (==)
-ne no igual (!=)
#!/bin/bash
num1=$1 # la variable toma el primer valor que le pasamos al script
num2=$2 # la variable toma el segundo valor que le pasamos al script
if [[ $num1 -gt $num2 ]];
then
echo $num1 es mayor que $num2
else
echo $num2 es mayor que $num1
fi
operador significado
= igual, las dos cadenas de texto son exactamente idénticas
https://bioinf.comav.upv.es/courses/unix/scripts_bash.html 5/10
1/7/2020 Scripts de bash
operador significado
!= no igual, las cadenas de texto no son exactamente idénticas
< es menor que (en orden alfabético ASCII)
> es mayor que (en orden alfabético ASCII)
-n la cadena no está vacía
-z la cadena está vacía
#!/bin/bash
string1='reo'
string2='teo'
if [[ $string1 > $string2 ]];
then
echo Eso es verdad
else
echo Eso es mentira
fi
#!/bin/bash
string1='reo'
if [[ $string1 = *e* ]];
then
echo Eso es verdad
else
echo Eso es mentira
fi
Por ejemplo, podemos hacer un script que nos informe sobre el contenido de un directorio:
#!/bin/bash
for file in $(ls);
https://bioinf.comav.upv.es/courses/unix/scripts_bash.html 6/10
1/7/2020 Scripts de bash
do
if [[ -d $file ]];
then
echo directorio: $file
else
if [[ -x $file ]];
then
echo archivo ejecutable: $file
else
echo archivo no ejecutable: $file
fi
fi
done
Borrar subcadena
Hay diferentes formas de borrar subcadenas de una cadena:
https://bioinf.comav.upv.es/courses/unix/scripts_bash.html 7/10
1/7/2020 Scripts de bash
Reemplazar subcadena
También existen diferentes formas de reemplazar subcadenas de una cadena:
Operaciones aritméticas
Por último, Bash también permite la operaciones aritméticas con número enteros:
+ - : suma, resta
~$ $num=10
~$ echo $((num + 2))
** : potencia
~$ echo $((num++))
~$ echo $num
~$ echo $((++num))
~$ echo $num
Parallel
https://bioinf.comav.upv.es/courses/unix/scripts_bash.html 8/10
1/7/2020 Scripts de bash
Aunque este programa no tiene nada que ver con los scripts de Bash, sí que hacer uso de
éstos no resultará muy útil para preparar el archivo de entrada para parallel. Este programa
requiere pasarle un archivo donde cada línea es trabajo a realizar y puede consistir tanto en
un comando como en un pequeño script a ejecutar. Y es ahí donde saber algo de scripting
en Bash nos puede facilitar la tarea. Veamos un ejemplo de input para parallel:
to_run.txt:
zcat file1.fasta.gz | grep '>' | sed 's/>//' | bgzip > sample_names1.t
zcat file2.fasta.gz | grep '>' | sed 's/>//' | bgzip > sample_names2.t
zcat file3.fasta.gz | grep '>' | sed 's/>//' | bgzip > sample_names3.t
zcat file4.fasta.gz | grep '>' | sed 's/>//' | bgzip > sample_names4.t
zcat file5.fasta.gz | grep '>' | sed 's/>//' | bgzip > sample_names5.t
zcat file6.fasta.gz | grep '>' | sed 's/>//' | bgzip > sample_names6.t
parallel no viene instalado por defecto en algunas distribuciones Linux, por tanto, lo primero
que debemos hacer es instalarlo:
~$ parallel -j 4 to_run.txt
Ejercicios
1. Haz un script que cree 40 archivos .txt en una carpeta de tu escritorio (usa touch para
crearlos)
2. Haz un script que comprima con gzip sólo los archivos 25 y 29.
4. Crea un script que copie todos los archivos (no directorios) /etc a una carpeta de tu
escritorio.
5. Prepara un script que cuenta el número de directorios y archivos que hay en /etc
https://bioinf.comav.upv.es/courses/unix/scripts_bash.html 9/10
1/7/2020 Scripts de bash
7. Supon que tenemos un programa en Python llamado scan_qtl.py que requiere tres
parámetros de entrada a, b. Queremos correr todas la combinaciones paramétricas
posibles para a de 1 a 10 de 1 en 1 y b = [pop1, pop2, pop3, all]. Prepa el archivo de
entrada para usar en parallel. La línea de ejecución del programa sería algo similar a
python scan_qtl.py 1 pop1 > results.txt
Curso Unix
https://bioinf.comav.upv.es/courses/unix/scripts_bash.html 10/10