shell script

(1/16) > >>

EMPICAL:
¿Que es un shell script?

Son basicamente programas escritos en lenguaje de shell muy parecidos a los programas de procesamiento por lotes de windows. Es natural que linux nos ofrezca esta capacidad gracias su sistema de entrada/salida que lo hace tan potente.

¿Para que nos sirve un shell script?

Para automatizar tareas que hacemos habitualmente ahorrando un tiempo considerable al usuario.

Ejemplo:

Para que comprendamos el funcionamiento y que es un shell script la mejor manera es que veamos un ejemplo de un sencillo script que por ejemplo mandaremos un mail con el contenido de un archivo de log a un usuario registrado en nuestro sistema.

Lo primero que debemos hacer es determinar que tipo de shell usaremos para el script y donde se encuentra en el sistema.

El nombre del destinatario y su mail es algo que tambien deveremos averiguar.

Pensaremos que esto sera como leer noticias y para ellos usaremos el comando inn (internetnews)

Antes de seguir hay que explicar que es el concepto de canalizacion en linux. En linux no solo se puede redireccionar la entrada STDIN y la salida STDOUT de unos archivos a otros, si no que, como linux concibe esta entrada y salida como flujos de datos, tambien existe el concepto de canalizacion de flujos directamente de un programa a otro. Gracias a las canalizaciones se puede usar directamente la salida STDOUT de un programa como la entrada STIN de otro.

Para introducir una canalizacion en linux hay que introduccir en la linea de comandos la barra vertical (|) entre los programas.

Usaremos entre otros el comando tail que sirve para mostrar la parte final del documento. Como se trata de un archivo de logs solo nos interesara enviarle los ultimos registros del archivo puesto que la mayor parte de los registros aumentan por el final.

Usaremos otros comando que no voy a explicar ya que esto es solo un ejemplo para que se vea el funcionamiento de un shell script.
Código
#!/bin/bash
echo Hola a todos!! | mail destinatario@ensistema.mail
grep "destinatario" /usr/local/httpd/logs/access_log | tail -l100 | lpr xterm -e trn &
exit
 
Guardaremos esto en un archivo llamado mail_log y le daremos permisos de ejecucion chmod 755 mail_log.

Ya solo nos quedara ejecutarlo ./mail_log.

Pues hasta aqui creo que queda claro que es un script, para que se usa y como hacer uno.

Cualquiera que desee añadir informacion a este tema puede hacerlo libremente intetare postear mas cosas sobre shell script ya que me parece un tema interesante y algo que cualquier usuario de linux deberia dominar en mayor o menor medida.

Aver si la gente se anima y creamos un buen tema sobre shell script para empezar aprender desde 0.

..sR. aDiKtO..:
Ya k E*M*P*I*C*A*L ha empezado este tema ( k me parece MUY interesante), voy a continuar yo, primero con como se construye un shell script:
[*]Se crea un archivo de texto y se introduce en la primera linea el interprete k se va a utilizar para ejecutarlo, en el caso anterior:
[/list]Código:

#!/bin/bash
[*]En las lineas siguientes se ponen las intrucciones, una por linea:
Código
echo Hola a todos!! | mail destinatario@ensistema.mail
grep "destinatario" /usr/local/httpd/logs/access_log | tail -l100 | lpr xterm -e trn &
exit
o en la misma linea separadas por un punto y coma ( ; ), excepto cuando es background o nohup.
Código
echo Hola a todos!! | mail destinatario@ensistema.mail; grep "destinatario" /usr/local/httpd/logs/access_log | tail -l100 | lpr xterm -e trn &
exit
[*]Luego se tiene k dar permisos de ejecucion y ejecutarlo como ha dicho E*M*P*I*C*A*L. Tambien se puede ejecutar con un interprete de comandos distito al predefinido, por ejemplo con:
Código
sh mail_log
ó
ksh mail_log
ó
...
Con estas ordenes el script seria ejecutado por sh ó ksh ó ... cuando en verdad tenia k ser ejecutado por bash (primera linea del script)[/list]

Continuemos con los redireccionamientos:
[*]La tuberia ( pipe, o raya vertical '|' ), es un programa k redirige la salida de un programa a la entrada de otro, veamos un ejemplo:
Código:

cat archivo.txt | grep adikto
Esta orden hace:
[*]cat archivo --> muestra el contenido de un archivo de texto.
[*]grep adikto --> muestra por pantalla las lineas k tengan el patron, en este caso 'adikto'.
[*]cat archivo.txt | grep adikto --> muestra por pantalla las lineas del archivo archivo.txt k tengan la palabra adikto.
[/list]
Como se ha podido comprobar, la salida de 'cat archivo.txt' se ha introducido como entrada a 'grep adikto' a traves de '|' y el resultado se ha mostrado por la salida estandar ( la pantalla).
[*]Redireccion de salida ( '>' ), es redirigir la salida estandar a otro sitio, veamos las clases k hay:
[*]'>' --> redireccion truncada, redirige la salida a otro sitio. Un ejemplo de esto seria:
[/list]Código:

ls -l / > archivo.txt
Con lo k el contenido del archivo.txt contendria la salida del 'ls -l /'
[*]'>>' --> redireccion añadida, añade la salida a otro sitio. Por ejemplo:
Código:

ls -l /boot >> archivo.txt
El contenido del archivo archivo.txt contiene la salida del 'ls -l /' del ejemplo anterior mas el 'ls -l /boot' de este ejemplo.
Si ahora hicieramos lo mismo k en el ejemplo anterior:
Código:

ls -l / > archivo.txt
El archivo archivo.txt SOLO contendria el 'ls -l /'.
[*]'2>' --> redireccion de errores, redirige la salida del programa y los errores a otro sitio. Por ejemplo:
Código:

cdrecord -adikto 2> archivo.txt
La opcion '-adikto' no existe, y el error k tendria k salir va a parar al archivo archivo.txt.
[*]'&>' --> redireccionamiento total, redirige TODO a otro sitio. Por ejemplo:
Código:

cdrecord --help &> archivo.txt
La ayuda de cdrecord ( --help ) va a parar a archivo.txt.[*]Redireccionamiento de entrada ( '<' ), la entrada de un programa es un archivo. Por ejemplo:
Código:

grep adikto < archivo.txt
La orden 'grep aditko' toma como entrada, el contenido de 'archivo.txt', (vease la similitud con las tuberias). Muestra las lineas k contiene archivo.txt con la palabra 'adikto'.

Ahora le toca a otro continuar......xDDD

Rojodos:
----------   Uso de variables en shell-script:

Asignación: Nombre=valor
Acceso a su contenido: $Nombre

Podemos utilizar el comando read para leer variables desde teclado y el comando echo para visualizar su contenido (este comando también puede utilizarse para mostrar mensajes por pantalla).

Ejemplo:

Código
read nombre apellido1 apellido2
echo Los valores leidos por teclado son: $nombre $apellido1 $apellido2

----------   Variables especiales:

$0: Nombre del Shell-Script que se está ejecutando.
$n: Parámetro o argumento pasado al Shell-Script en la posición n, n=1,2,...
$#: Número de argumentos.
$*: Lista de todos los argumentos.
$$: PID del proceso que se está ejecutando.
$!: PID del último proceso ejecutado.
$?: Salida del último proceso ejecutado



Le toca a otro :D

..sR. aDiKtO..:
Ampliando un poco lo de las varibles, una varible puede tener como valor el resultado de un programa, por ejemplo:
Código:

variable=$(ls --help)
El unico problema es k lo guarda sin retorno de carro. Para ver el resultado, ya sabeis:
Código
echo $variable
Una cosa curiosa es k los bash scripts tienen un error con la orden 'echo', para solucionarlo simplemente hay k utilizar la opcion '-e' y poner entre comillas los datos a mostrar:
Código
echo -e "Asi ya no hay error"

Ademas se puede utilizar la barra invertida al final de una linea para indicar al echo k la frase continua, aparte el echo tiene opciones adicionales como salto de linea, .... (vease 'man echo' y 'info echo'), por ejemplo:
Código
echo -e " toda \
esta \
frase \
se \
escribe \
en la \
misma \
linea."
Esto puede ser util para organizar el bash script, al final os pondre un ejemplo k kedara todo mas claro ;)
                      
En los bash scripts se pueden utilizar colores en las letras y de fondo, simplemente con:
Código:

echo -e "\033[1;37m BLANCO \033[0m"
Con lo k mostrara la palabra BLANCO en color blanco ( k original k soy xDD). Veamos ahora k colores hay:
Código:

Negro --> 0;30m    
Gris oscuro --> 1;30m
Rojo --> 0;31m    
Rojo claro --> 1;31m
Verde --> 0;32m    
Verde claro --> 1;32m
Marrón --> 0;33m    
Amarillo --> 1;33m
Azul --> 0;34m    
Azul claro --> 1;34m
Púrpura --> 0;35m    
Púrpura claro --> 1;35m
Cyan --> 0;36m    
Cyan claro --> 1;36m
Gris claro --> 0;37m    
blanco --> 1;37m
Como habreis supuesto para k las palabras salgan de un color hay k escribir:
Código
\033[
Y acontinuacion el codigo del color k os he puesto un par de lineas mas arriba, y para volver al color por defecto:
Código
\033[0m

Tambien se puede cambiar el color de fondo, de la misma manera k antes pero con esta codificacion:
Código
Negro --> 40m  
Rojo --> 41m  
Verde --> 42m  
Marrón --> 43m  
Azul --> 44m  
Púrpura --> 45m    
Cyan --> 46m
Gris claro --> 47m

Un shell script k os puede ser util para recordar esto es:
Código
#!/bin/bash
 echo "  Sobre gris claro:        Sobre negro:"
 echo -e "\033[47m\033[1;37m  Blanco        \033[0m\
 1;37m \
 \033[40m\033[1;37m  Blanco        \033[0m"
 echo -e "\033[47m\033[37m  Gris Claro    \033[0m\
    37m \
 \033[40m\033[37m  Gris Claro    \033[0m"
 echo -e "\033[47m\033[1;30m  Gris          \033[0m\
  1;30m \
 \033[40m\033[1;30m  Gris          \033[0m"
 echo -e "\033[47m\033[30m  Negro         \033[0m\
    30m \
 \033[40m\033[30m  Negro         \033[0m"
 echo -e "\033[47m\033[31m  Rojo          \033[0m\
    31m \
 \033[40m\033[31m  Rojo          \033[0m"
 echo -e "\033[47m\033[1;31m  Rojo Claro    \033[0m\
  1;31m \
 \033[40m\033[1;31m  Rojo Claro    \033[0m"
 echo -e "\033[47m\033[32m  Verde         \033[0m\
    32m \
 \033[40m\033[32m  Verde         \033[0m"
 echo -e "\033[47m\033[1;32m  Verde Claro   \033[0m\
  1;32m \
 \033[40m\033[1;32m  Verde Claro   \033[0m"
 echo -e "\033[47m\033[33m  Marrón        \033[0m\
    33m \
 \033[40m\033[33m  Marrón        \033[0m"
 echo -e "\033[47m\033[1;33m  Amarillo      \033[0m\
  1;33m \
 \033[40m\033[1;33m  Amarillo      \033[0m"
 echo -e "\033[47m\033[34m  Azul          \033[0m\
    34m \
 \033[40m\033[34m  Azul          \033[0m"
 echo -e "\033[47m\033[1;34m  Azul Claro    \033[0m\
  1;34m \
 \033[40m\033[1;34m  Azul Claro    \033[0m"
 echo -e "\033[47m\033[35m  Púrpura       \033[0m\
    35m \
 \033[40m\033[35m  Púrpura       \033[0m"
 echo -e "\033[47m\033[1;35m  Rosa          \033[0m\
  1;35m \
 \033[40m\033[1;35m  Rosa          \033[0m"
 echo -e "\033[47m\033[36m  Cyan          \033[0m\
    36m \
 \033[40m\033[36m  Cyan          \033[0m"
 echo -e "\033[47m\033[1;36m  Cyan Claro    \033[0m\
  1;36m \
 \033[40m\033[1;36m  Cyan Claro    \033[0m"

 
Las variables son creadas y destruidas en el mismo script, si se kieren conservar o exportar a otra shell o script, se hace con:
Código:

export variable
A partir de ese momento la varible 'variable' k era local, pasa a ser global, y se puede utilizar en otras shells.

EMPICAL:
Ejecuciones condicionales while

Para utilizar las instrucciones condicionales es necesario crear una condicion que la instruccion pueda comprobar.

While

El comando while realiza acciones mientras se cumpla una condicion determinada.

Para entender mejor como funciona esta condicion vamos a poner un ejemplo:

Queremos mandar mails cada cierto tiempo a una serie de personas y se seguiran enviando mientras no recibamos contestacion. Una vez recibida la contestacion los mails dejaran de enviarse.
Código:

>set saludo=('/bin/mail | grep -cv No')
>wihle ($saludo==0)
?echo "Hola soy EMPICAL" | mail destinatario@caulquiera.mail
?echo "Hola soy EMPICAL" | mail destinatario2@caulquiera.mail
?sleep 60
?set saludo=('/bin/mail | grep -cv No')
?end

Hacemos uso del comando grep para contar las lineas (opcion -c) que no conitienen la palabra No y asigna el resultado a la variable saludo. Si se canaliza la salida de /bin/mail hacia grep y se escriben los cambios entre comillas, la shell ejecutara los cambios y devolvera la salida correspondiente, que es lo que se asigna a la variable.

Si fueramos malintencionados y variaramos algunas cosillas de este script podriamos llenar los buzones de correo de los destinatarios en poco tiempo, por que mientras la variable $saludo siga siendo igual a 0 el script seguira enviando mensajes cada 60 segundos a los destinatarios. Piensen que pasaria si modificamos sleep y le damos el valor 1, apenas daria tiempo a los destinatarios a contestar y tendrian su correo saturado y mientras no se reciba ningun mensaje en /bin/mail seguira mandando mensajes. Ya que hasta que no reciba un mail no habra una linea que no contenga No en mail.

Mientras se cumpla la condicion while ($saludo==0) mail seguira enviando mensajes a los destinatarios.

Navegación

[0] Índice de Mensajes

[#] Página Siguiente