Tema 7
Tema 7
1. Introducción 3
2. Ejecución de un script 4
4. Ejecución condicional 12
4.1 El comando if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
4.2 El comando case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
5. Ejecución iterativa 18
5.1 El bucle for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
5.2 El bucle while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
5.3 El bucle until . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
5.4 La estructura select . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1. Introducción
El lenguaje shell es un lenguaje de programación de alto nivel que permite ejecutar
secuencias de órdenes, seleccionar operaciones alternativas dependiendo del resultado y
repetir acciones del programa.
Existen diversas versiones de shell, no obstante, en este manual se tratarán las direc-
trices básicas para construir programas sobre la shell de tipo bash, la cual, por otra parte
es la versión más extendida.
Un script es un fichero de texto normal que contiene una serie de comandos, expre-
siones y estructuras de control que se ejecutan secuencialmente. Como cualquier otro
programa, el usuario deberá tener permiso de ejecución en el script.
Por lo tanto, para crear un script basta con crear un fichero con cualquier editor de
textos, por ejemplo nano o gedit y, a continuación, escribir los comandos que queremos
ejecutar.
Supongamos que vamos a escribir un script que muestra la fecha y un listado de los
ficheros del directorio en el que nos encontramos. Podría ser algo como lo siguiente:
1 #!/bin/bash
2
3 # Script: listado.sh
4 # Descripción: muestra la hora del sistema y lista
5 # los archivos del directorio actual.
6
3
2. Ejecución de un script
La forma más común de ejecutar un script en la shell actual es usando ./, por ejemplo:
./ prueba . sh
Un script siempre comienza por la marca #! en la primera fila del fichero para indicar
la ruta absoluta del intérprete de comandos que ejecutará el programa. En nuestro caso,
vamos a utilizar el intérprete bash, así que todos los scripts deben tener la siguiente línea
inicial:
#!/bin/bash
El código debe ser fácilmente legible, incluyendo espacios y sangrías que separen
claramente los bloques de código.
Incluir comentarios para los bloques o comandos importantes, que requieran una
cierta aclaración.
Para los nombres de los programas, suelen utilizarse letras minúsculas, mientras
que para las variables, se suelen utilizar mayúsculas.
4
3. Programando en shell script
En este apartado trataremos las diversas características y recursos que nos ofrece el
lenguaje shell.
3.1 Comentarios
Se pueden insertar comentarios en los programas shell, utilizando el carácter #. Se
ignora todo lo que existe desde # hasta el final de la línea. Los scripts suelen encabezarse
con comentarios que indican lo que hace el script. También, se suelen colocar comentarios
de documentación en diversas partes del script para mejorar la comprensión y facilitar el
mantenimiento.
Ejemplos:
5
3. PROGRAMANDO EN SHELL SCRIPT 6
Ejemplo:
exit 1
1. Variables locales
Las variables locales son definidas dentro del script por el programador y
permiten almacenar y operar con valores. Fuera de dicho ámbito, la variable
no existe y por tanto, no puede usarse.
Toman valor por medio del operador de asignación =. Por ejemplo:
2. Variables de entorno
En ocasiones puede ser útil que los scripts reciban algún tipo de argumento
(un directorio sobre el que actuar, un tipo de archivo que buscar,...) al ser
ejecutados.
Para pasar argumentos a un script, simplemente basta con escribir dichos
argumentos en la línea de comandos, detrás del nombre del script al ejecutarlo.
En el ejemplo, el script se llama mostrar.sh y se le pasan como argumentos
1, 2, 4 y 33.
./ mostrar . sh 1 2 4 33
1 #!/bin/bash
2
3 # Script: mostrar
4 # Descripción: recibe argumentos y los muestra
5
4. Variables especiales
Las variables especiales son variables que informan sobre el estado del proceso.
El intérprete las trata y modifica directamente, por lo tanto, son de sólo lectura.
Estas variables son las siguientes:
• $# indica el número de argumentos que se pasan al programa. En el ejemplo
anterior almacenaría el valor 4.
• $0 es nombre del script que estamos ejecutando.
3. PROGRAMANDO EN SHELL SCRIPT 8
1 #!/bin/bash
2
3 # Script: info-usuario
4 # Descripción: Muestra la información de un usuario
5
3.5 Entrecomillado
El lenguaje shell script, permite el uso de tres tipos de entrecomillado para llevar
a cabo el tratamiento de cadenas y expresiones. Los tipos de entrecomillado son los
siguientes:
1 DIR =/ etc
2 RES = " ls -l $DIR "
3 # Guarda la cadena ls -l /etc en la variable RES
1 A =1
2 RES = ' $A ' # Guarda la cadena $A en la variable RES .
1 #!/bin/bash
2
3 # Script: uso-read
4 # Descripción: Solicita el nombre al usuario y lo muestra
5
1. Comando expr
La orden expr toma los argumentos dados, los evalúa e imprime el resultado sobre
la salida estándar. Cada término de la expresión debe ir separado por espacios en
blanco.
La orden expr puede utilizar los siguientes operadores: +, -, *, /, % (módulo). No
obstante, al ser el carácter * el símbolo comodín del shell, para indicar que se quiere
multiplicar deberá ir precedido por el carácter \.
Hay que indicar también que expr sólo opera sobre enteros y no sobre números
decimales. Por ejemplo:
2. Comando let
Mediante la orden let podemos almacenar el valor directamente en una variable.
Por ejemplo, supongamos que queremos dividir entre 2 el valor de una variable y
almacenar el resultado en otra variable.
1 J =4
2 let K = J /2 # Divide el valor de la variable j entre 2
3 echo $K # Muestra el valor de la variable K
3. Comando bc
Si queremos operar sobre números decimales, podemos utilizar la orden bc. Por
ejemplo, supongamos que queremos dividir entre 3 el valor de una variable y mostrar
el resultado por pantalla.
1 #!/bin/bash
2 X =10
3 echo " scale =10; $X /3 " | bc
4 # El resultado sería: 3.3333333333
4. Expresión ((operación))
Los dobles paréntesis se comportan como let, aunque, tienen la ventaja de que un
doble paréntesis puede incluir a otro doble paréntesis.
3. PROGRAMANDO EN SHELL SCRIPT 11
1 #!/bin/bash
2 Z =10
3 (( Z = Z *3) )
4 echo $Z # El resultado sería: 30
1 #!/bin/bash
2 Z =10
3 echo $ (( Z = Z *3) ) # El resultado sería: 30
1 #!/bin/bash
2 Z =10
3 echo $ (( Z = $ (( Z +3) ) *3) ) # El resultado sería: 39
4. Ejecución condicional
Como en muchos otros lenguajes, en shell script, se permite la ejecución condicional
de partes del programa. Para construir esta ejecución condicional, se usan los comandos
if y case.
4.1 El comando if
Su formato es el siguiente:
if condicion
then ordenes
[ elif condicion
then ordenes ]
[ else ordenes ]
fi
• test condición
Ejemplo: test $1 = 3
• [ condición ]
Ejemplo: [ $1 = 3 ]
Para ambos casos se evalúa una condición; si la condición es cierta, devuelve cero
y si no es cierta, devuelve un estado distinto de cero.
Además, se pueden utilizar dobles corchetes [[ ]] en lugar de los simples para
realizar comparaciones. Los dobles corchetes son una mejora con respecto a los
12
4. EJECUCIÓN CONDICIONAL 13
• [[ condición ]]
Ejemplo: [[ $1 = 3 ]]
Comprobación de cadenas:
Comprobación de ficheros:
Recuerda que entre las condiciones y los operandos siempre tiene que haber un espacio
en blanco.
Concatenanción de comparaciones:
En ocasiones se necesitará que se cumplan varias condiciones o una combinación de
ellas para poder tomar una u otra acción. Para conseguir esta concatenación de opera-
ciones, se deben utilizar operadores booleanos:
y, representado por &&. Esto implica que las dos comparaciones tienen que ser
ciertas.
o, representado por ||. Con que una de las dos comparaciones sea cierta, es sufi-
ciente.
Ejemplos:
A continuación, se muestran algunos ejemplos de uso de la orden if:
Ejemplo 1:
1 if [ -z $HOSTNAME ]
2 then
3 echo " No esta definido el nombre del equipo "
4 fi
Ejemplo 2:
1 if ` mkdir PRUEBA `
2 then echo " El directorio se creo correctamente "
4. EJECUCIÓN CONDICIONAL 15
Ejemplo 3:
1 if [ $ # - lt 3 ]
2 then echo " El numero de parametros es menor de tres "
3 exit 1
4 else echo " El numero de parametros es correcto "
5 fi
Ejemplo 4:
1 if [ $1 - gt 1 ] && [ $1 - lt 5 ]
2 then
3 echo " El parametro $1 es mayor que 1 y menor que 5 "
4 fi
Ejemplo 5:
1 case cadena
2 in
3 lista_patrones1 )
4 orden 1
5 orden 2
6 orden n
7 ;;
8 [ lista_patrones2 )
9 orden 1
10 orden 2
11 orden n
12 ;;]
13 esac
Las posibles opciones soportadas por la estructura selectiva múltiple se expresan me-
diante patrones, donde pueden aparecer caracteres comodines, evaluándose como una
expansión de ficheros, por lo tanto el patrón para representar la opción por defecto es el
asterisco *. Cada bloque de código acaba con ;;.
Dentro de una misma opción pueden aparecer varios patrones separados por la barra
vertical |, como una expresión lógica O.
Si la expresión que se comprueba cumple varios patrones de la lista, sólo se ejecuta el
bloque de código correspondiente al primero de ellos, ya que la evaluación de la estructura
se realiza en secuencia.
Un ejemplo habitual de esta estructura lo encontramos en los scripts de inicio de
servicio que hay en /etc/init.d. Estos scripts reciben un parámetro para iniciar, parar,
reiniciar o mostrar el estado del servicio. Para controlar el valor del parámetro, y las
acciones a realizar en cada caso, es habitual utilizar una estructura case.
Ejemplo:
1 case $1 in
2 start )
3 echo " Se ha requerido el inicio del servicio "
4 ;;
5 stop )
6 echo " Se ha requerido la parada del servicio "
7 ;;
8 restart )
9 echo " Se ha requerido reiniciar el servicio "
4. EJECUCIÓN CONDICIONAL 17
10 ;;
11 status )
12 echo " Se ha requerido mostrar el estado del servicio "
13 ;;
14 *) #
15 # Esto identifica cualquier valor ,
16 # por lo que sirve como valor por defecto .
17 #
18 # Se puede utilizar para detectar errores .
19 ;;
20 esac
5. Ejecución iterativa
Un bucle es la ejecución repetida de un bloque de código. El número de veces que se
ejecuta el bloque de código dependerá del tipo de bucle, pero todos se basan en el uso de
una expresión lógica (una condición) para limitar este número de ejecuciones, es decir, el
bloque de código continúa ejecutándose de forma repetitiva cuando la condición del bucle
se cumple. La forma de especificar esta condición en el bucle determina el tipo.
Hay dos ordenes que pueden ser interesantes y que pueden utilizarse dentro de un bucle
para romper la secuencia normal de ejecución de comandos en determinadas situaciones.
Estas son las órdenes break y continue.
continue. Se interrumpe la ejecución del bloque de código del bucle para volver a
evaluar la condición.
Shell script permite la utilización de distintos tipos de bucles, que se explican a con-
tinuación:
1 for NUMERO in 1 2 3 4 5
2 do
18
5. EJECUCIÓN ITERATIVA 19
Ejemplo 2:
1 for K in ` ls / etc `
2 do
3 TAMANYO = ` du - sh / etc / $K `
4 echo " $K "
5 echo " Tamanyo : $TAMANYO "
6 done
while orden_comparacion
do
ordenes
done
El bucle while se ejecutará el bloque de órdenes mientras que la condición sea cierta.
Veamos un ejemplo:
1 # !/ bin / bash
2
3 CONTADOR =0
4
5 while [ $CONTADOR - lt 10 ]; do
6 echo " El contador es $CONTADOR "
7 let CONTADOR = CONTADOR +1
8 done
Su formato es el siguiente:
until orden_comparacion
do
ordenes
done
Veamos un ejemplo:
1 # !/ bin / bash
2
3 CONTADOR =20
4
5 until [ $CONTADOR - lt 10 ]; do
6 echo " El contador es $CONTADOR "
7 let CONTADOR = CONTADOR -1
8 done
ejecución de un listado del directorio personal, que muestre la fecha o la información del
usuario.
#!/bin/bash
# Script: select
# Descripción: Muestra menu de seleccion al usuario
clear
Al ejecutar este script vemos que se muestra un menú con las cuatro opciones. El
usuario tiene que pulsar un número entre 1 y 4. Sin embargo, en la estructura case que
controla la opción elegida debemos contemplar la cadena que hemos puesto como opción
de menú, no el número de opción. Podemos incluir opciones con espacios en blanco si la
entrecomillamos. El bucle es infinito y solamente al elegir la opción 4 es cuando sale por
efecto del comando break.