Script de shell (bash)
Un script de shell es un archivo de texto con una lista de comandos de shell y se ejecuta como un programa para realizar una tarea o un conjunto de tareas. El objetivo principal de un script de shell es automatizar tareas y ahorrar tiempo. Es importante entender la estructura básica de un script de shell, ya que es usted interactúa con un clúster de computación a través de scripts de shell (Véase el próximo capítulo sobre Grid Engine)
¿Qué es Bash?
Hay muchos shells diferentes disponibles en los sistemas tipo Unix. La Bourne Again Shell (Bash) es una de ellas, es la shell por defecto en los sistemas GNU/Linux. Tiene algunas ventajas con respecto a otros shells y es prácticamente el shell estándar, y mostraremos cómo usarlo para hacer scripts a continuación.
Escribiendo un simple script de shell bash
Un script de shell básico es sólo una serie de comandos. Eso es lo que mostraremos a continuación.
Escribamos un sencillo script que emita «hola mundo» en la pantalla utilizando el comando echo
. Guardaremos el archivo de texto como myScript.sh
#!/bin/bash echo Hello World
ejecutando una sintaxis de script de shell:bash your-script-name
. En nuestro caso, escribimos:
$ bash myScript.sh Hello World
ejemplo más complicado
Escribamos un script un poco más complicado utilizando más comandos del shell. El script utiliza el ls
para listar los archivos y utiliza el comando wc -l
que cuenta el número de líneas en un archivo dado o en la entrada estándar. En este caso, wc -l
cuenta el número de líneas en la salida de ls -l
. Todo esto se consigue utilizando la tubería |
.
contenido del script.sh:
#!/bin/bash echo here are the list of files ls -l echo The number of files: ls -l | wc -l
Podemos ejecutarlo de la siguiente manera:
$ bash script.sh
variables en scripts bash
También puedes utilizar variables en scripts bash. Que son útiles para capturar la salida de los comandos intermedios y utilizarlos para ejecutar otros comandos.No hay tipos de datos para las variables. Una variable en bash puede contener cualquiera de los siguientes: un número, un carácter o una cadena de caracteres.
No es necesario declarar una variable, simplemente asignando un valor a su referencia se creará.
Ahora crearemos un simple script con una variable. Asignaremos la cadena Hello world
a esa variable e imprimiremos esa variable con echo
.
#!/bin/bash VAR="Hello world" echo $VAR
Al asignar la variable no usamos el signo $
, pero al usar la variable tuvimos que usar el signo $
.
Argumentos de línea de comandos en scripts bash
El script también puede tomar argumentos de línea de comandos. Aquí modificamos el script que lista el archivo para que tome un argumento de línea de comandos. El argumento será una ruta a un directorio.
contenido del script2.sh:
#!/bin/bash VAR= echo here are the list of files ls -l $VAR echo The number of files: ls -l $VAR | wc -l
Así es como se ejecuta el script:
$ bash script2.sh /home/user/project
Los argumentos se almacenan en variables con un número en el orden del argumento empezando por el 1
- Primer argumento: $1
- Segundo argumento: $2
- y así sucesivamente…
En nuestro caso, corresponde a
/home/user/project
.
Operaciones aritméticas scripts bash
Las operaciones aritméticas sobre enteros en bash se realizan con el siguiente formato:
#!/bin/bash x=6 y=2 $((10 - 5)) $((x-y)) echo $((x-y)) echo $((10-5))
También puedes copiar y pegar estos comandos en la consola para ver cómo funcionan. Los comandos echo
deberían dar como resultado 4
y 5
.
La aritmética de bash no soporta puntos flotantes (por ejemplo, la operación 1.3 -1 no funcionará en bash), necesitas usar el comando bc
. Vea este ejemplo de stackOverflow para un ejemplo sobre cómo usar bc
.
Looping sobre archivos
Si está tratando de automatizar una tarea usando scripts de bash, es muy probable que tenga que aplicar ciertos comandos en cada archivo en un directorio. Esto podría lograrse con bucles de carácter salvaje*
y for
. El siguiente script almacena todos los archivos ‘.txt’ del directorio /path/to
en la variable FILES
. Luego, para cada archivo, calcula el número de líneas y lo emite con el comando wc -l
.
#!/bin/bash FILES=/path/to/*.txt for f in $FILES do echo "Processing $f file..." # count number of lines and output that for file $f wc -l $f done
Más sobre scripts bash
Puede escribir scripts de shell aún más complicados utilizando estructuras de control (bucles if/else, for/while) y lograr muchas cosas sólo con el uso de scripts de shell, pero eso está fuera del alcance del documento. Vea los enlaces de abajo si quiere mejorar la escritura de scripts de shell.
- http://www.freeos.com/guides/lsst/
- http://www.tldp.org/LDP/Bash-Beginners-Guide/html/