Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Shell Script.
José Navero
Esta Documento trata de la programación en
Shell Script desde un nivel básico.
http://www.namocode.com
http://devthisblog.namocode.es/
http://www.namocode.com
http://devthisblog.namocode.es/
.com/
Índice
1. Una pequeña introducción. .................................................................................... 3
2. Que necesitamos para escribir un Shell script. ...................................................... 3
3. Ejecutando un Shell Script. ................................................................................... 3
4. Nuestro primer Shell Script. .................................................................................. 3
5. Algunos conceptos básicos. ................................................................................... 3
Sobre comandos: ........................................................................................................... 3
Comentarios: ................................................................................................................. 4
Salida por pantalla: ........................................................................................................ 4
6. Variables. ............................................................................................................... 4
El comando Export ........................................................................................................ 4
El comando set .............................................................................................................. 4
Variables posicionales y automáticas ............................................................................ 4
Arrays ............................................................................................................................ 5
7. Salida por pantalla y entrecomillado. .................................................................... 5
Caracteres no imprimibles............................................................................................. 5
Entrecomillar ................................................................................................................. 6
Ejecución de órdenes..................................................................................................... 6
Redireccionamiento....................................................................................................... 6
Segundo plano ............................................................................................................... 7
8. Shell Script, El lenguaje. ....................................................................................... 7
Estructuras de control .................................................................................................... 7
La instrucción IF. ....................................................................................................... 8
La instrucción CASE. ................................................................................................ 9
Bucles ............................................................................................................................ 9
Bucle WHILE ............................................................................................................ 9
Bucle UNTIL ........................................................................................................... 10
Bucle FOR ............................................................................................................... 10
Pequeña reflexión. ....................................................................................................... 10
Varios comandos… ..................................................................................................... 11
Comando test ........................................................................................................... 11
Comando break ........................................................................................................ 11
Comando continue ................................................................................................... 12
Comando sleep ......................................................................................................... 12
Comando expr .......................................................................................................... 12
Anexo I. Ejemplos .......................................................................................................... 13
2
http://www.namocode.com
http://devthisblog.namocode.es/
.com/
1. Una pequeña introducción.
Este escrito da por supuesto el conocimiento de los comandos de Unix / Linux. Los
Script de Shell es una forma de realizar tareas repetitivas, ejecución de comandos Unix
y como veremos a continuación la programación en Shell script es muy potente. Para
este manual he utilizado sco Unix y el Shell ksh. Al igual que ksh existen diferentes
shells. Una Shell es un intérprete de comandos en nuestro caso en Unix / Linux. El más
utilizado (por mi parte en Ubuntu es el bash). Como ya he indicado antes este manual lo
he orientado a sco unix y ksh (Korn Shell) aunque sirve para cualquier otro shell.
Una vez que tenemos nuestro script escrito, podemos ejecutarlo de diferentes
formas.
Para hacer nuestro primer script de Shell, debemos crear un archivo con un editor de
texto (ejemplo vi).
#!/bin/ksh
echo “Hola que tal estas”
Sobre comandos:
3
http://www.namocode.com
http://devthisblog.namocode.es/
.com/
Comentarios:
6. Variables.
Para utilizar una variable basta con hacer una asignación como vemos a
continuación.
variable = “valor”
Si deseamos introducir un dato a una variable desde el teclado, utilizamos la orden read
seguido de la variable.
read variable
El comando Export
El comando set
Existen variables que son activadas por el Shell de forma automática, estas
variables tienen gran importancia por su utilidad a la hora de crear nuestros scripts. En la
siguiente tabla veremos dichas variables.
4
http://www.namocode.com
http://devthisblog.namocode.es/
.com/
Variable Descripción
$? Variable que indica el código de retorno del script. Retorna 0 si se ha
ejecutado con éxito y distinto de 0 si ha habido un error.
$$ Variable que almacena el pid del procedo de ejecución del script.
$! Variable que contiene el número de identificación del último proceso en
background.
$1, $2 … Variables posicionales. Son las variables que le pasamos por línea de
$9, ${10} comandos a nuestro script de Shell. Nota, desde la posición 10 en adelante
… deben llevar llaves {}
$# Variable que contiene el número total de parámetros que se le pasan al script.
$* Variable que crea una cadena de texto con todas las variables pasadas.
Arrays
Como ya sabemos, la orden echo muestra por pantalla los textos o variables que
deseemos. Podemos darle formato a esta salida, todo depende del entrecomillado y de
los caracteres no imprimibles como vemos a continuación.
Caracteres no imprimibles
Ejemplo:
echo “Hola\n Me llamo Juan”
5
http://www.namocode.com
http://devthisblog.namocode.es/
.com/
Entrecomillar
Ejemplos:
Orden Resultado
echo * Muestra los archivos (funciona igual que cuando ponemos ls)
echo \* Muestra el carácter * por pantalla
variable = 1 Muestra por pantalla prueba variable
echo ‘Prueba variable’
variable = 1 Muestra por pantalla 1
echo “variable”
Ejecución de órdenes
Redireccionamiento
Una vez que ejecutemos una orden, tenemos la posibilidad de enviar el resultado a
un dispositivo diferente de la pantalla. Por ejemplo, podemos enviar el resultado a un
archivo.
Ejemplos:
pwd;date > resul
En este caso, primero ejecuta el comando pwd y posteriormente crea el archivo
resul donde insertará el resultado de ejecutar date.
(pwd;date) > resul
Está orden similar a la anterior la diferencia (los paréntesis) en vez de introducir el
resultado de date insertará el resultado de ejecutar ambas ordenes.
Como podemos ver con el símbolo mayor que realizamos los redireccionamientos.
Si ponemos un único símbolo borra el fichero si existe y lo crea nuevo. Sin embargo al
poner dos mayor que seguidos (>>) El resultado que tenemos es que si el fichero no
6
http://www.namocode.com
http://devthisblog.namocode.es/
.com/
existe se crea y si existe, anexa el resultado en el fichero. Por otro lado además de
recoger los resultados, también podemos redireccionar los errores de la siguiente forma:
Pwd > resul 2 > error
En este ejemplo almacenamos en el fichero resul el resultado de ejecutar el
comando y si se produce un error, dicho error se almacena en el fichero error.
Segundo plano
Estructuras de control
Son estructuras que permiten ejecutar entre un bloque u otro, en base a una
condición previamente indicada.
Las estructuras posibles en Shell script son las siguientes if y case que veremos a
continuación.
7
http://www.namocode.com
http://devthisblog.namocode.es/
.com/
La instrucción IF.
Se cumple
Bloque 1
Variable IF condición Resto del programa
Bloque 2
No se cumple
Para un if sencillo:
if <comando> then
Bloque de instrucciones
fi
Y por supuesto podemos anidar varios if, es decir, meter una instrucción if dentro
de otro.
if<comando> then
Bloque de instrucciones 1
else
if<comando> then
Bloque de instrucciones 2
else
Bloque de instrucciones 3
fi
fi
8
http://www.namocode.com
http://devthisblog.namocode.es/
.com/
La instrucción CASE.
Si variable
Vale X Bloque 1
Vale Z Bloque 3
case variable/expresión in
1) Orden1
Orden2
…;;
[2-4]) Orden1
Orden2
….;;
*) Orden1
Orden2
…;
esac
Bucles
Bucle WHILE
9
http://www.namocode.com
http://devthisblog.namocode.es/
.com/
while comando
do
Orden1
Orden2
…
done
Bucle UNTIL
until comando
do
Orden1
Orden2
…
done
Bucle FOR
Pequeña reflexión.
Hasta aquí todo perfecto, pero ahora ¿Qué comandos uso en las evaluaciones?
¿Cómo utilizo todo esto?.
10
http://www.namocode.com
http://devthisblog.namocode.es/
.com/
A continuación iré mostrando los comandos más comunes, así como algunos ejemplos
de Shell script.
Varios comandos…
Comando test
-eq: igual
-ne: distinto
-gt: mayor que
Operadores -lt: menor que
-ge: mayor o igual que
-le: menor o igual que
Comando break
Con este comando podemos interrumpir una secuencia de control como puede
ser un bucle, si se produce una acción concreta podemos indicar que deje de ejecutar el
bucle “rompiéndolo” para continuar con la ejecución del script.
11
http://www.namocode.com
http://devthisblog.namocode.es/
.com/
Comando continue
Este comando, forzamos a un bucle a que realice otra iteración, sin que acabe de
realizar todos los comandos o evaluadores que sean posteriores.
Comando sleep
Este comando realiza una pausa de uno a varios segundos en función del tiempo
indicado. La sintaxis es la siguiente: sleep 2 (realiza una pausa de 2 segundos).
Comando expr
Este comando realiza una operación básica entre dos variables o más. Un
ejemplo de su uso podría ser este: a= expr $a + 1
Para ver más información sobre algunos script en el Anexo I adjunto varios ejemplos de
script donde se puede ver el uso de los comandos, evaluadores, bucles etc.
12
http://www.namocode.com
http://devthisblog.namocode.es/
.com/
Anexo I. Ejemplos
#!/bin/sh
echo “Hola Mundo”
#!/bin/sh
clear
echo “Introduzca un numero”
read numero
res= expr $numero % 2
if test res –eq 0 ; then
echo “El numero es par”
else
echo “El numero es impar”
fi
echo “Fin programa”
Ejemplo 3. Este script que reciba un directorio como primer parámetro, y a continuación
una lista de archivos. El script valida que los parámetros recibidos sean realmente
archivos y luego copiarlos al directorio recibido
#!/bin/sh
if test $# -le 1; then
echo “Argumentos no validos”
exit
fi
13
http://www.namocode.com
http://devthisblog.namocode.es/
.com/
Ejemplo 4. Este script muestra un menú con los nombres de login de los usuarios
conectados y al elegir uno se nos muestre el nombre completo del mismo así como su la
ruta de su directorio personal.
#!/bin/sh
clear
usuario=''
echo "--------------- MENU USUARIOS -----------------"
echo "-----------------------------------------------"
who -s | cut -f1,2 -d ' ' | cut -f1,1 -d ' '|nl
echo "-----------------------------------------------"
echo
echo "Escribe el nombre de uno de los usuarios logados en el sistema"
echo "para ver su alias y la ruta de su carpeta personal."
echo "Si ves algun usuario repetido es porque estas usando una"
echo "terminal de comandos con ese usuario."
echo
echo -n "Usuario :"
read usuario
if [ -z $usuario ]; then
echo
echo "No se ha introducido ningun dato"
echo
else
nombreu=$(grep ^$usuario /etc/passwd | cut -d ":" -f5 | cut -d "," -f1)
homeu=$(grep ^$usuario /etc/passwd | cut -d ":" -f6 | cut -d "," -f1)
if [ -z $nombreu ]; then
echo
echo "El nombre de usuario indicado no existe"
echo
else
echo "El nombre del usuario indicado es :" $nombreu
echo "El directorio personal es :" $homeu
echo
echo -n "Pusla una tecla para continuar..."
read enterKey
echo
fi
fi
14
http://www.namocode.com
http://devthisblog.namocode.es/
.com/
#!/bin/bash
#Inicio del script.
while :
do
clear
opcion=0
echo "-------------MENU PRINCIPAL--------------------"
echo "-----------------------------------------------"
echo "a. Visualizar atributos del directorio actual"
echo "b. Visualizar directorio actual"
echo "c. Mostrar el contenido de un fichero"
echo "d. Salir"
echo "-----------------------------------------------"
echo
echo -n "Elige una opcion: "
read opcion
case $opcion in
a)
clear
echo "Mostrando los atributos del directorio actual"
ls -l .
read enterkey
;;
b)
clear
echo "Mostrando el contenido del directorio actual"
ls
read enterkey
;;
c)
clear
echo -n "Indica el nombre de un fichero: "
read fichero
if test -f $fichero; then
cat $fichero
fi
read enterkey
;;
d)
exit
;;
*)
clear
echo "La opcion $opcion no esta en la lista"
read enterkey
;;
esac
done
15