Programacion Shell
Programacion Shell
Programacion Shell
Programación Shell
Actualmente los sistemas operativos basados un Unix, es decir la nuevas versiones de GNU/Linux, han
evolucionado durante los últimos años para convertirse en sistemas operativos que gozan de gran
popularidad, tales como Ubuntu, Linux Mint, Debian, Canaima, entre otros.
Entre las fortalezas de este tipo de sistemas, que podemos mencionar, está su gran colección de
programas o aplicaciones, los comandos que permiten controlar todo, desde la cantidad de líneas en un
archivo, el envío de correo electrónico, desplegar un calendario del mes y año que el usuario
establezca, etc. La principal fortaleza de este tipo de sistemas consiste en la facilidad con la que estos
comandos pueden ser combinados para realizar funciones mas sofisticadas.
Con el fin de proveer una interfaz consistente y fácil para que el usuario interactuara con el sistema
operativo Unix/Linux se desabolló el shell
El shell, terminal o concha, es simplemente un programa que permite una interfaz entre el usuario y
el núcleo o kernel del sistema GNU/Linux . Este programa permite a los usuarios darle ordenes al
sistema por medio de la interpretación de comandos o instrucciones que se introducen en la línea de
comandos o en archivos de tipo shell scripts. Un shell script no es mas que un programa escrito en
lenguaje shell.
Se puede decir que el shell es la “cara visible” del sistema, de que dispone el usuario. Por ejemplo
durante el proceso de arranque del sistema, es posible visualizar este tipo de interfaz en diversos modos
dependiendo de como este configurada, es decir, se puede ver el proceso de arranque del sistema en
modo texto o en modo gráfico, ejemplos de estos dos modos, están presentes en los sistemas Debian y
Canaima.
Nos damos cuenta cuando estamos en un shell, terminal o interprete de comandos, porque
normalmente se despliega su símbolo de espera "$" o "#", que luego son ejecutados por el sistema. La
figura 1 ilustra esta situación.
1
Administración Local
Los simbolos “$” o “#” representan el prompt de cara al usuario normal o usuario administrador o root
respectivamente, indicando que puede introducir una línea de comandos. Después de introducirla el
shell pone los procesos necesarios en acción para ejecutar la acción solicitada mediante una serie de
fases:
• Leer e interpretar los comandos ingresados
• Evaluar los caracteres comodín tales como: $ * ? |
• Gestionar las redirecciones de E/S, los pipes o entubamientos y procesos en segundo plano
(background)
• Manejar señales
• Preparar la ejecución de programas
En concreto la línea de comando consiste en ejecutar comandos del sistema, o shell scripts.
El Shell Script
Un shell script o mas comúnmente scipt, es un archivo o fichero de texto que contiene una serie de
instrucciones que se pueden ejecutar en la línea de comando. Dicho de otro modo el shell o interprete
de comandos lee, linea a línea las instrucciones que están contenidas en el archivo.
Para que el script pueda ser ejecutado por la línea de comandos, el archivo que lo contiene debe tener
permisos de ejecución.
Para el administrador, los shell scripts son muy importantes básicamente por dos razones:
2
Administración Local
Todos los programas que se invocan por medio de un shell poseen tres archivos predefinidos,
especificados por los correspondientes descriptores de archivos (file handles). Estos archivos son :
1. standard input (entrada estándar): es la que en general, se ingresa por medio del terminal o
consola; utiliza el descriptor número 0
2. standard output (salida estándar): en general, se lleva a cabo por la pantalla del terminal; utiliza
el descriptor 1.
3. standard error (salida estándar de errores): éste en general se le asigna a la pantalla del terminal;
utiliza el descriptor 2
Lo anterior destaca el hecho de que cualquier programa ejecutado desde el shell tendrá la entrada
asociada al teclado del terminal, su salida hacia la pantalla y, en el caso de producirse errores, también
los envía a la pantalla .
Esta condición puede ser modificada puesto que el shell permite, así mismo, mecanismos que permiten
alterar las condiciones ya descritas de la siguiente manera:
1. Redirección: el shell de GNU/Linux trata los dispositivos de E/S y los archivos, como
archivos propiamente tal, esta condición implica que desde el punto de vista del usuario, se
pueden redefinir los descriptores de los archivos para que los flujos de datos de un descriptor
vayan a cualquier otro descriptor; a esto se le conoce como redirección.
2. Tuberías (pipes): las tuberías permiten que la salida estándar de un programa pueda ser
utilizada como entrada estándar para otro programa. Varios programas pueden ser conectados
entre sí mediante éstas para formar lo que se denomina un pipeline.
3. Concurrencia de programas de usuario: los usuarios pueden ejecutar varios programas al
mismo tiempo, indicando que su ejecución se va a producir en segundo plano (background), en
términos opuestos a primer plano (o foreground), donde se tiene un control exclusivo de
pantalla. Otro uso consiste en permitir trabajos largos en segundo plano, permitiendo al usuario,
interactuar con el shell con otros programas en primer plano.
1. Redirección
• $ ls -l > file.txt
la instrucción anterior envía la salida del comando ls -l a un archivo llamado file.txt.
◦ Pero que ocurre si el archivo file.txt existe antes de ejecutar el comando anterior? En ese
3
Administración Local
2. Tuberías
• $ cat file.txt | sort
◦ la instrucción anterior permite visualizar el contenido del archivo file.txt y la salida de ese
comando se convierte en la entrada del comando sort, es decir, se verá la salida ordenada.
• Observe en su terminal la salida del siguiente comando
◦ $ls -l /etc | grep ^d | sort | more
3. Concurrencia
• Para ejecutar un programa en segundo plano basta con poner el símbolo & al final del comando
◦ $ gedit &
▪ esta instrucción permite abrir el editor de textos gedit y a la vez continuar utilizando lo
mismo terminal para otras tareas.
Shells Disponibles
Es importante destacar que el shell no es mas que una interfaz que permite interactuar con el kernel del
sistema, y es además independiente del mismo, motivo por el cual, es posible disponer de varios shell
en el sistema.
4
Administración Local
mezcla de las funcionalidades del Bourne y del C, con ciertas mejoras. El prompt por defecto es
el $
• El shell C (csh): tiene unos cuantos agregados interesantes al Bourne, como un histórico de
comandos, alias, aritmética desde la línea de comandos, completa los nombres de los archivos y
control de trabajos en segundo plano. El prompt por defecto para los usuarios es ‘%’, una
ventaja de los scripts en C shell es que, como su nombre indica, su sintaxis se basa en el
lenguaje C
• Todos permiten la escritura de shell scripts que son luego interpretados al ser ejecutados.
• Los usuarios del sistema cuentan con un shell preconfigurado asociado a ellos. Esta información
se proporciona al crear las cuentas de los usuarios y la misma queda registrada en el archivo de
password /etc/passwd. En GNU/Linux el shell preconfigurado es bash.
• Se pueden escribir scripts en cualquier shell, pero se debe ajustar a la sintaxis de cada uno, que
es normalmente diferente. La sintaxis de las construcciones, así como los comandos internos, se
encuentran bien documentados en la página man de cada shell.
◦ La primera línea indica al sistema, el tipo de shell a utilizar y la segunda línea imprime
por pantalla el saludo “hola mundo”
5
Administración Local
6
Administración Local
Variables y Argumentos
En bash el uso de variables es muy sencillo, simplemente se asigna valor a una variable de la siguiente
manera VARIABLE=valor, pero para utilizar la variable se antepone el signo $ de la siguiente manera:
$VARIABLE
7
Administración Local
ejemplo de esto:
NOMBRE=”Andrea Munoz”
echo “Bienvenido $NOMBRE”
su salida sería
Bash cuenta con una serie de variables de entorno que podemos utilizar en nuestros scripts.
• $HOME : Contiene la ruta del directorio home del usuario.
• $PATH : Contiene los directorios donde se encuentran los ejecutables
• $TERM : nombre del terminal (Config Terminal)
• $BASH : Ruta del interprete bash
• $PWD : Directorio Actual
Operaciones Aritméticas
En bash hay varias maneras de realizar operaciones aritméticas, en este manual se presenta la forma
con el comando expr.
La sintaxis de este comando es la siguiente: ARG1 expresión ARG2.
Donde Operación puede ser:
+ Suma
- Resta
/ División
\* Multiplicación
8
Administración Local
Consideraciones:
• En la multiplicación se debe anteponer la barra invertida (\) al signo asterisco (*) para que bash
no realice sustitución de nombre.
• La salida del comando expr es enviado a la salida estándar (pantalla)
• Las variables en bash son todas cadenas de caracteres por lo que debemos tener cuidado de no
pasarle como argumentos a expr variables con letras cuando estamos realizando una operación
aritmética.
• Entre cada argumento y la operación debe haber un espacio, para que expr pueda distinguir los
argumentos y su operando.
Ejemplos
• $ expr 10 + 10
20
• $ x=10
$ y=2
$ expr $x / $y
5
Otra forma de evaluar las expresiones:
• $ resta=`expr $x - $y`
• $ mult=`expr $x \* $y`
• $ echo "$x menos $y vale $resta"
10 menos 2 vale 8
• $ echo "La multiplicación de $x y $y es $mult"
La multiplicación de 10 y 2 es 20
9
Administración Local
Estructuras de Control
1. La sentencia if-then-else-fi.
bash tiene la ventaja que nos permite saber si la ejecución de una instrucción ha sido exitosa, esta
condición se puede visualizar en la variable $?. La ejecución exitosa de un comando hace que la
variable $? tenga el valor de cero (0) y si se produce algun error, la salida de esa misma variable será de
uno (1).
Ejemplo:
• $ expr a +b
expr: argumento no entero
$ echo $?
2
La salida de la variable $? con un valor diferente de 0 indica que hay un error en la ejecución del
comando.
• $ expr 2 + 2
4
$ echo $?
0
La salida de la variable $? con un valor igual a 0 indica que el comando se ejecutó exitosamente.
Esta situación se puede aplicar a nuestro script, que también podrá devolver valores mediante el
comando exit numero, donde numero es el valor que retornara. Si la ejecución del script fue exitosa
debemos finalizarlo con exit 0 y sino con exit y un numero distinto de cero . Esta es una de las muchas
maneras de ejecutar un script.
if comando1
then
comando2
comando3
10
Administración Local
...
...
...
else
comando4
comando5
...
...
fi
• En su terminal como usuario escriba: gedit usuario.sh y escriba las siguientes líneas
11
Administración Local
El comando test evalúa una expresión y retorna un valor que será cero (0) si la expresión es verdadera o
distinto de cero si la expresión es falsa.
Esta utilidad en conjunto con la sentencia if permite evaluar distintos tipos de expresiones. La sintaxis
es la siguiente: test EXPRESION
Dentro de ese contextp, EXPRESION, puede ser una evaluación de: cadenas de caracteres, números
enteros, archivos (evaluando permisos y la existencia del mismo) o bien, operadores lógicos que llevan
a realizar una combinación de condiciones.
12
Administración Local
Para mas detalles es importante remitirse al manual del comando ejecutoriando man test.
-z CADENA verdadero si la longitud de la cadena es cero (nula)
-n CADENA verdadero si la longitud de la cadena es distinta de cero (no nula)
Ejemplos
• $ STR=”abcd”
$ echo $?
0
• $ test “$STR” != abcd
echo $?
0
13
Administración Local
Actividad: escriba un script que le pregunte su nombre y su edad, además debe identificar de acuerdo a
la edad si la persona es mayor de edad o no
2. Estructuras for
Ejemplo: Se quiere crear una estructura for que itere en una lista de números, veremos dos maneras
de hacerlo
14
Administración Local
3. Estructura while
Este comando implementa una estructura repetitiva en la cual el conjunto de comandos se ejecuta
mientras se mantenga válida una condición (while = mientras). La condición se examina al principio y
luego cada vez que se completa la secuencia de comandos. Si la condición es falsa desde la primera
vez, los comandos no se ejecutan nunca. La sintaxis
while condición
do comandos
done
Ejemplo 1: se requiere un script que sea capaz de crear archivos de 1 a 9, los liste y luego los
borre.
15
Administración Local
16
Administración Local
4. Estructura until
Esta instrucción implementa una estructura repetitiva en la cual el conjunto de comandos se ejecuta
hasta que se cumpla una condición. La sintaxis
until condicion; do
comandos
done
17
Administración Local
18
Administración Local
5. Estructura case
case $CADENA in
patrón1)
comandos1;;
patrón2)
comandos2;;
...
*)
comandosN;;
esac
El patrón * que se se coloca al final; compara cualquier cadena, y permite ejecutar comandosN
cuando ninguna de las opciones anteriores fue satisfecha.
Ejemplo 1
Crear un script que dada una lista de números y un patrón de comparación, presente a la salida
el valor del patrón
19
Administración Local
20
Administración Local
Introducción
En la actualidad cualquier en sistema operativo, se dispone de herramientas que permiten realizar, con
cierta periodicidad, tareas (algunas de ellas internas del Sistema Operativo, otras definidas por el
administrador, e incluso algunas definidas por un usuario -con los privilegios adecuados-). La
necesidad de este tipo de herramientas, obedece a la necesidad de garantizar el adecuado
funcionamiento interno del sistema operativo, así como también el aceptable funcionamiento del
sistema.
Uno de los ejemplos mas notables de este tipo de programas,corresponde a un sistema antivirus, que
desde que es instalado permite configurar la actualización del software y la revisión del sistema
semanalmente (es decir, es una tarea programada de manera semanal).
Veamos algunos casos en los que resulta útil la automatización de una tarea:
• Es típico que, para un óptimo rendimiento, el responsable del sistema informático deba realizar
actividades de gestión periódicas, así como algunas de control del mismo (por ejemplo, revisar
diariamente el grado de ocupación de los discos, testear cada 30 minutos la ocupación del
procesador y poder generar un aviso en caso de ocupación de más de un 70% ).
• Teniendo en cuenta lo anterior al administrador del sistema, puede resultarle práctico definir
una tarea que borre de forma periódica los archivos temporales (por ejemplo, el directorio /tmp),
así como que se realicen copias de seguridad cada día de diversos directorios de datos.
• También resulta útil (y en algunos casos obligado como parte de la propia política de empresa)
realizar algún tipo de informe mensual sobre el funcionamiento del sistema (sobre todo en caso
de servidores).
• Dentro de la tareas programas en el sistema, se debe considerar el apagado del equipo de
acuerdo al horario de trabajo.
• Se puede programar cualquier tarea periódica de acuerdo a las necesidades del usuario, como la
actualización del equipo o la descarga programada de información en horarios de menor tráfico
de datos.
Que es cron?
21
Administración Local
El nombre cron viene del griego chronos que significa “tiempo”. En el sistema operativo GNU/Unix,
cron es un administrador regular de procesos en segundo plano (demonio) que ejecuta procesos o script
a intervalos regulares (por ejemplo, cada minuto, día, semana o mes). Los procesos que deben
ejecutarse y la hora en la que deben hacerlo se especifican en el archivo crontab
Como Funciona
De manera general se puede decir, que el demonio cron inicia de /etc/rc.d/ o /etc/init.d dependiendo de
la distribución. Cron se ejecuta en el background, revisa cada minuto la tabla de tareas crontab en
/etc/crontab o en /var/spool/cron en búsqueda de tareas que se deban cumplir. Como usuario podemos
agregar comandos o scripts con tareas a cron para automatizar algunos procesos. Esto es útil por
ejemplo para automatizar la actualización de un sistema o un buen sistema de respaldos.
Que es Crontab?
Crontab es un archivo de texto que guarda una lista de comandos a ejecutar en un tiempo especificado
por el usuario. Crontab verificará la fecha y hora en que se debe ejecutar el script o el comando, los
permisos de ejecución, esta tarea se ejecuta en segundo plano (background). Cada usuario puede tener
su propio archivo crontab, de hecho el /etc/crontab se asume que es el archivo crontab del usuario root,
cuando los usuarios normales (e incluso root) desean generar su propio archivo de crontab, disponen
del comando crontab.
Para ver si cron esta instalado ejecute como superusuario : # aptitude search cron
Para instalar cron en su sistema ejecute como superusuario: # aptitude install cron
Crontab
Para entender cómo se deben programar las tareas, para que sean ejecutadas, es necesario entender el
formato del archivo de configuración (/etc/crontab). Este archivo está estructurado por líneas, cada una
de las cuales contiene una tarea programada, según el siguiente formato:
22
Administración Local
Existen símbolos especiales para los cinco primeros campos, que indicarían aspectos genéricos:
* : indica cualquier valor
, : actúa como separador de una lista de valores
# : indica que lo que acompaña es un comentario (no se ejecutará)
- : sirve para indicar un rango de valores
/ : sirve para indicar un paso de valor (por ejemplo, en el campo mes si se indica */3 se está
detallando que la tarea se realizará cada tres meses).
Ejemplos de uso de crontab : (se omite el comando que se ejecutaría siguiendo las instrucciones
dadas por los campos anteriores a él ):
• 01**** Se ejecuta al minuto 1 de cada hora de todos los días
• 15 8 * * * A las 8:15 a.m. de cada día
• 15 20 * * * A las 8:15 p.m. de cada día
• 00 5 * * 0 A las 5 a.m. todos los domingos
• *5**0 Cada minuto de 5:00a.m. a 5:59a.m. todos los domingos
• 45 19 1 * * A las 7:45 p.m. del primero de cada mes
• 01 * 20 7 * Al minuto 1 de cada hora del 20 de julio
• 10 1 * 12 1 A la 1:10 a.m. todos los lunes de diciembre
• 00 12 16 * 3 A las 12h de los días 16 de cada mes y que sea Miércoles
• 30 9 20 7 4 A las 9:30 a.m. del dia 20 de julio y que sea jueves
• 30 9 20 7 * A las 9:30 a.m. del 20 de julio de cualquier día de la semana
• 20 * * * 6 Al minuto 20 de cada hora de los sábados
• 20 * * 1 6 Al minuto 20 de cada hora de los sábados de enero
23
Administración Local
Sintaxis de crontab:
Hay varias maneras de utilizar un archivo con cron, a continuación se muestran algunas:
1.- Generar un archivo de nombre: ejemplo.cron de una línea (recordar que se ejecutan las tareas por
líneas mediante un shell) con el contenido:
0 9 4 07 * echo "Vacaciones!!!!!! :-D"
2.- Ejecutar la carga del fichero de planificación:
$ crontab ejemplo.cron
3.- Para estar seguro que se ha añadido a la lista de tareas, mirar la lista de las mismas:
24
Administración Local
$ crontab -l
Donde debería devolver el contenido del archivo. En el ejemplo, se mostraría el mensaje (echo) todos
los 4 de Julio, a las 7 de la mañana.
Otra manera de programar la misma tarea, consiste en ejecutar crontab -e y poner las instrucciones
directamente en el archivo crontab.
3) Ejemplo: Vamos a automatizar el proceso de actualización del sistema, para lo cual crearemos el
siguiente script :
25
Administración Local
10 15 * * * /home/usuario/actualiza.sh
Con esta instrucción su sistema se actualizará todos los días a las 10:15 (la ejecución se realiza
en segundo plano)
4) Ejemplo: Programar una tarea que apague su computadora cada noche a las 10:30 pm
26
Administración Local
http://sololinex.wordpress.com/2009/03/11/ejecutar-un-comando-en-segundo-plano/
http://www.jdbaldoma.net/2012/05/3-formas-de-ejecutar-comandos-en.html
http://lesthack.com.mx/2009/05/31/programacion-en-bash-linux-iv-estructuras-for-while-until/
http://usemoslinux.blogspot.com/2010/11/cron-crontab-explicados.html
http://linux.ciberaula.com/articulo/linux_cron/
http://hatteras.wordpress.com/2010/12/02/crontab-programarautomatizar-tareas/
27