Capítulo 15 - Shell Bash Scripting PDF
Capítulo 15 - Shell Bash Scripting PDF
Objetivos de aprendizaje
Al final de este capítulo, debes ser capaz de:
Explicar las características y capacidades del bash Shell
scripting.
Conocer la sintaxis básica de las declaraciones y secuencias
de comandos.
Estar familiarizado con los distintos métodos y
construcciones.
Saber cómo probar la existencia y propiedades de archivos
y otros objetos.
Usar sentencias condicionales, tal como
bloques if-then-else
Realizar operaciones aritméticas usando lenguaje de scripting.
Introducción a scripts
Supongamos que deseamos
buscar un archivo, debemos
comprobar si el archivo existe
y, a continuación, responder
en consecuencia, mostrando
un mensaje para confirmar o
no confirmar la existencia del
archivo. Si sólo tenemos que
hacerlo una vez, podemos
simplemente escribir una
secuencia de comandos en el
terminal. Sin embargo, si necesitamos hacer esta operación varias veces, el camino a
seguir es la automatización. Con el fin de automatizar los conjuntos de comandos
necesitaremos aprender cómo escribir shell scripts, de los cuales los más comunes son
utilizados con bash. El gráfico ilustra algunos de los beneficios de la implementación de
scripts.
bash scripts
Vamos a escribir un simple bash script que muestra un mensaje de dos líneas en la
pantalla. Escribimos:
$ cat > exscript.sh
#!/bin/bash
echo "Hola"
echo "Mundo"
Y pulsamos Enter y Ctrl-D para guardar el archivo, o simplemente crear exscript.sh en
nuestro editor de texto favorito. A continuación, escribimos chmod +x exscript.sh para
hacer que el archivo sea ejecutable. (El comando chmod +x hace que el archivo sea
ejecutable para todos los usuarios). A continuación, podemos ejecutarlo escribiendo
simplemente ./exscript.sh o haciendo:
$ bash exscript.sh
Hola
Mundo
Nota: si utilizamos la segunda forma, no tenemos que hacer el archivo ejecutable.
Ejemplo interactivo usando bash scripts
Ahora, vamos a ver cómo crear un ejemplo más interactivo utilizando un bash script. Se
pedirá al usuario que introduzca un valor, que será visualizado en la pantalla. El valor se
almacena en una variable temporal, sname. Podemos hacer referencia al valor de una
variable de shell colocando un $ delante del nombre de la variable, como $sname. Para
crear este script, necesitamos crear un archivo llamado ioscript.sh en su editor favorito
con el siguiente contenido:
#!/bin/bash
# lectura interactiva de variables
echo "Introduce tu nombre"
read sname
# Muestra los valores de las variables
echo $sname
Una vez más, lo hacemos ejecutable con chmod +x ioscript.sh
En el ejemplo anterior, cuando el script ./ioscript.sh se ejecuta, el usuario recibirá un
mensaje INTRODUZCA SU NOMBRE. A continuación, el usuario debe introducir un valor y
pulse la tecla Enter. El valor será impreso en pantalla.
Nota adicional: El hash-tag/pound-sign/number-sign (#) se utiliza para iniciar los
comentarios en la secuencia de comandos y puede colocarse en cualquier lugar de la línea
(el resto de la línea es considerado un comentario)
Valores de retorno
Todos los scripts de shell
generan un valor de
retorno tras la finalización de
su ejecución; el valor se puede
ver con la instrucción exit. El
retorno de valores permite a un
proceso supervisar el estado de salida de otro proceso, a menudo de una relación
padre-hijo. Esto ayuda a determinar cómo ha terminado este proceso y tomar las medidas
necesarias adecuadas, dependerá del éxito o el fracaso.
Visualización de los valores de retorno
Mientras se ejecuta un script, podemos buscar un valor específico o condición y obtener
un resultado exitoso o no. Por convención, un éxito se devuelve como 0, y un fracaso
como un valor distinto de cero. Una manera fácil de demostrar una finalización exitosa o
no es ejecutar ls en un archivo que exista y otro que no, como se muestra en el ejemplo
siguiente, donde el valor de retorno se almacena en una variable de entorno representada
por $?:
$ ls /etc/passwd
/etc/passwd
$ echo $?
0
En este ejemplo, el sistema es capaz de localizar el archivo /etc/passwd y devuelve un
valor de 0 para indicar el éxito; el valor de retorno se almacena siempre en la variable de
entorno $?. A menudo, las aplicaciones traducen estos valores de retorno en un mensaje
significativo fácilmente comprensible por el usuario.
Sección 2: Sintaxis
Caracter Descripción
Tenga en cuenta que cuando se inserta # al principio de una línea de comentario, la línea
entera es ignorada.
# Esta línea no se ejecutará
Funciones
Una función es un bloque de código que implementa un conjunto de operaciones. Las
funciones son útiles para ejecutar procedimientos muchas veces incluso con diferentes
variables de entrada. Las funciones se suelen denominar también subrutinas. El uso de
funciones en scripts requieren de dos pasos:
1. Declarar la función
2. Llamar a la función
La declaración de la función requiere un nombre que se utiliza para invocarla. La sintaxis
correcta es:
function name () {
command...
}
Por ejemplo, la siguiente función se denomina display:
display () {
echo "Este es un ejemplo de función"
}
La función puede ser tan larga como queramos y pueden tener muchas instrucciones o
declaraciones. Una vez definida la función puede llamarse posteriormente tantas veces
como sea necesario. En el ejemplo que se muestra en la figura siguiente, se puede
observar un refinamiento de uso frecuente: el pasaje de argumentos a la función. El
primer argumento es referido como $1, el segundo como $2, etc.
Los Shell scripts se utilizan para ejecutar secuencias de comandos y otros tipos de
instrucciones.
Sustitución de comandos
En ocasiones, puede ser necesario sustituir el resultado de un comando como una parte
de otro comando. Puede hacerse de dos maneras:
Encerrando la orden interna con las comillas invertidas (`).
Encerrando la orden interna en $( )
No importa el método, el comando se ejecutará en un entorno de shell nuevo, y la salida
estándar del shell se insertará donde se indicó la sustitución de comandos.
Prácticamente cualquier comando se puede ejecutar de esta manera. Ambos métodos
permiten la sustitución de comandos; sin embargo, el método $( ) permite el
anidamiento de comandos. Los nuevos scripts deberían utilizar siempre este método más
moderno. Por ejemplo:
$ cd /lib/modules/$(uname -r)/
En el ejemplo anterior, la salida del comando "uname -r" se convierte en el argumento
para el comando cd.
Variables de entorno
Casi todos los scripts utilizan variables que contienen un valor, que puede ser utilizado
en cualquier parte del script. Estas variables pueden ser definidas por el usuario o por el
sistema. Muchas aplicaciones utilizan estas variables de entorno (ya cubiertas en el
capítulo "Entorno de usuario") para alimentar entradas, validación y control del
funcionamiento.
Algunos ejemplos de variables de entorno estándar son HOME, PATH y HOST. Cuando se hace
referencia a las variables de entorno, deben ser precedidas por el símbolo $ como
en $HOME. Podemos ver y ajustar el valor de las variables de entorno. Por ejemplo, el
siguiente comando muestra el valor almacenado en la variable $PATH:
$ echo $PATH
Sin embargo, no es necesario el prefijo cuando ajustamos o modificamos el valor de la
variable. Por ejemplo, el siguiente comando establece el valor de la variable MYCOLOR a
azul:
$ MYCOLOR=blue
Podemos obtener una lista de las variables de entorno con los comandos env, set
o printenv.
Exportar Variables
De forma predeterminada, las variables creadas dentro de un script sólo están disponibles
para los siguientes pasos de la script. Todos los procesos hijos (sub-shells) no tienen
acceso automático a los valores de estas variables. Para ponerlas a disposición de los
procesos hijo, deben ser realizado usando la instrucción export como en:
export VAR=value
Parámetro Significado
$1 Primer parámetro
$2, $3, etc. Segundo, tercer parámetro, etc.
$# Número de argumentos
Redirección de la salida
La mayoría de los sistemas operativos aceptan la entrada desde el teclado y muestran la
salida en pantalla de la terminal. Sin embargo, con las script del shell podemos enviar la
salida a un archivo. El proceso de desviar la salida a un archivo se denomina redirección
de la salida.
El carácter > es usado para escribir la salida a un archivo. Por ejemplo, el siguiente
comando envía la salida de free en el archivo /tmp/free.out:
Redirección de entrada
De la misma forma que la salida puede redirigirse a un archivo, la entrada de un comando
se puede leer desde un archivo. El proceso de leer la entrada desde un archivo se
denomina redirección de entrada y utiliza el carácter < . Si creamos un archivo llamado
script8.sh con el siguiente contenido:
#!/bin/bash
echo "Line count"
wc -l < /temp/free.out
y, a continuación, lo ejecutamos con chmod +x script8.sh ; ./script8.sh, contará el
número de líneas del archivo /temp/free.out y mostrará los resultados.
Sección 3: Construcciones
La instrucción if
Se utiliza la instrucción if para la toma de decisiones
condicionales, es una estructura básica que cualquier
lenguaje de programación o secuencia de comandos
útiles debe tener.
Cuando se usa una instrucción if, las subsiguientes
acciones dependen de la evaluación de determinadas
condiciones, tales como:
Comparaciones numéricas o de cadena
Valor de retorno de un comando (0 si fue exitoso)
Existencia de un archivo o permisos
En forma compacta, la sintaxis de una instrucción if es:
if TEST-COMMANDS; then CONSEQUENT-COMMANDS; fi
Una definición más general es:
if condition
then
stetements
else
statements
fi
Ejemplo:
Sentencias if anidadas
La instrucción elif
Usando la instrucción if
La siguiente instrucción if comprueba si existe el archivo /etc/passwd y, si se encuentra
el archivo muestra el mensaje /etc/passwd exists.:
if [ -f /etc/passwd ]
then
echo "/etc/passwd exists."
fi
Observemos el uso de los corchetes ([]) para delinear la condición de prueba. Hay
muchos otros tipos de pruebas que podemos realizar, como, por ejemplo, comprobar si
dos números son iguales, mayores o menores el uno que el otro y tomar una decisión en
consecuencia; discutiremos estas otras pruebas.
En scripts modernos podemos ver corchetes dobles como en [[ -f /etc/passwd ]]. Esto
no es un error. Nunca es erróneo hacerlo y evita algunos problemas sutiles como referirse
a una variable de entorno vacía sin encerrarla entre comillas dobles; no vamos a hablar de
esto aquí.
Pruebas de archivos
Podemos utilizar la instrucción if para comprobar los atributos de un archivo como:
Existencia de archivo o directorio
Permiso de lectura o escritura
Permiso de ejecución.
Por ejemplo, en el ejemplo siguiente:
if [ -f /etc/passwd ] ; then
ACTION
fi
La instrucción if comprueba si el archivo /etc/passwd es un archivo regular.
Notemos que es muy común poner "; then" en la misma línea que la instrucción if.
bash proporciona un conjunto de condicionales de archivo, que se pueden usar con
la instrucción if, entre ellos:
Condición Significado
Test numéricos
Podemos utilizar los operadores definidos específicamente con la instrucción if para
comparar números. En la siguiente tabla se enumeran los distintos operadores que están
disponibles.
Operador Significado
-eq Igual a
-ne No es igual a
-lt Menos de