Capitulo 1
Capitulo 1
Shell Script
[CAP 1]
Contenido
Qu es un Shell script? Ejecutar un Shell script Uso de comentarios Variables y parmetros Uso de comillas Comando test Estructura de control Funciones Array Ejercicios Propuestos Otros paquetes
Script
17
Script
Shell Script
[CAP 1]
Qu es un shell?
Es el interprete de comandos, que permite que los comandos y programas que tecleamos sean ejecutados. En UNIX hay varios tipos de shell que ofrecen diferentes caractersticas: Bourne shell (sh) C shell (csh) TC shell (tcsh) Korn shell (ksh) Bourne Again SHell (bash
Shell script
Un shell script es un fichero donde hemos introducido cualquier comando que se puede ejecutar en la shell. Se pueden incluir comandos UNIX, utilidades, emplear pipes, redireccionar entradas y salidas, definir y utilizar variables, adems del uso de una serie de comandos UNIX creados para ser usados fundamentalmente en los shell scripts, como son condicionales y comandos para controlar el flujo del programa. Ejemplo Creamos con un editor de textos las siguientes lneas echo "Veamos quien esta en el sistema" who echo En que directorio me encuentro? pwd echo A que fecha estamos? date echo Bien! comencemos a trabajar... Lo guardamos con el nombre miscript
EJECUTAR EL SCRIPT
Podemos ejecutar el script de varias maneras: $ bash < miscript $ # Tambin podemos ejecutarlo de otra forma $ cat miscript | bash $ # Ejecutar pasando el nombre del fichero como argumento $ sh miscript $ # Ejecutar ordenes de un fichero desde la shell actual $ ./miscript
Para ejecutar el script de las maneras anteriores, slo es necesario que tenga permiso de lectura. Para ejecutarlo directamente como un comando necesitamos darle permiso de ejecucin,
17
Script
Shell Script
[CAP 1]
Uso de comentarios.
Suele ser bastante comn que despus de escribir un shell-script y no utilizarlo durante algn tiempo no recuerdes qu haca o cmo funcionaba. Debes acostumbrarte a insertar comentarios en tus shell scripts para explicar el propsito del script y cmo lo lleva a cabo. El shell ignora comentarios; stos slo son importantes para los usuarios.
Ejemplo: # Nombre: comenzar # Escrita: 6/12/99, Juanan Pereira # Propsito: Mostrar quin est conectado, nombre del directorio de # inicio y fecha echo Veamos quien est en el sistema.. who # aqui tambien pueden ponerse comentarios echo En qu directorio me encuentro? pwd echo A qu fecha estamos? date echo Bien! comencemos a trabajar... Ejecuta el script de nuevo y vers que los resultados no han cambiado. Los comentarios no modifican el comportamiento del script.
Variables y parmetros
Variables de entorno .
Hay una serie de variables afectan al comportamiento de la shell, tanto a la hora de trabajar de forma interactiva como desde los scripts que sta interpreta. Estas variables pueden ser accedidas y modificadas en la linea de comandos y tambin en los scripts. Se puede ver el valor de todas las variables de entorno definidas en un momento dado invocando al comando set sin argumentos. Algunas variables especialmente tiles y su significado: $HOME : Directorio 'home' del usuario. $PATH : Rutas en las que la shell busca los ejecutables cuando se invoca un comando. $? : Esta variable contiene el valor de salida del ltimo comando ejecutado, es til para saber si un comando ha finalizado con xito o ha tenido problemas. Un '0' indica que no ha habido errores, otro valor indica que s ha habido errores. $UID : Identificador del usuario que ejecuta el script. $! : Identificador de proceso del ltimo comando ejecutado en segundo plano.
Script
17
Script
Shell Script
[CAP 1]
Ejemplo 1.- Cdigo del script echo "Numero de parametros=$#" echo 'Primer valor='$0 echo 'Segundo valor='$1 echo 'Tercero Valor='$2 echo 'Cuarto Valor='$3 echo 'Todo='$* 2.- Salida
Script
17
Script
Shell Script
[CAP 1]
a) Comillas dobles . En general los caracteres especiales no son interpretados cuando estn entre
comillas dobles. Sin embargo algunos de ellos s son interpretados: $ :Esta permitido referenciar variables dentro de las comillas dobles. \ :Se pueden escapar caracteres. ` : Se puede realizar sustitucin de comandos, esto es, ejecutar un comando y sustituir la cadena por su salida. b) Comillas simples . Dentro de las comillas simples todos los caracteres son interpretados literalmente, ninguno de los caracteres especiales conserva sus significado dentro de ellas. c) Comillas invertidas . Poner una cadena entre comillas invertidas supone ejecutar su contenido como un comando y sustituir su salida.
Ejercicios Resueltos
1.-Pongamos que tenemos varios ficheros en el directorio actual. Dos de ellos son ficheros jpg, correo.jpg y tux.jpg. #!/bin/sh echo *.jpg Imprimir "correo.jpg tux.jpg". 2.-Usar comillas (simples y dobles) evitar esta expansin de comodines: #!/bin/sh echo "*.jpg" echo '*.jpg' Esto mostrar "*.jpg" dos veces. 3.-Las comillas simples son las ms estrictas. Evitan incluso la expansin de variables. Las comillas dobles evitarn la expansin de comodines pero no as la de variables: #!/bin/sh echo $SHELL echo "$SHELL" echo '$SHELL'
Esto mostrar:
/bin/bash /bin/bash $SHELL 4.-Finalmente existe la posibilidad de eliminar el significado especial de un nico caracter anteponiendole una barra invertida: echo \*.jpg echo \$SHELL Esto mostrar: *.jpg $SHELL
17
Script
Shell Script
[CAP 1]
echo "introduce el Tercer valor" read c m=$(echo "($a+$b+$c)/3" |bc -l) echo "La media es" echo $m 2.-Salida
Comando test
'test' es un comando externo que devolver un cdigo de retorno 0 o 1 dependiendo del resultado de la expresin que siga a continuacin. Se usa muchsimo y tiene dos formatos. 'test <expr>' o '[ <expr> ]'. ambas formas son equivalentes. Las expresiones de este tipo que solo pueden valer TRUE o FALSE se denominan expresiones lgicas. Comprobacin sobre ficheros -r <fichero> -w <fichero> -x <fichero> -f <fichero> -d <fichero> -c <fichero> -b <fichero> -p <fichero> -u <fichero> -s <fichero> TRUE si el fichero existe y es legible. TRUE si el fichero existe y se puede escribir. TRUE si el fichero existe y es ejecutable. TRUE si el fichero existe y es de tipo regular (normal). TRUE si existe y es un directorio. TRUE si existe y es un dispositivo especial de caracteres. TRUE si existe y es un dispositivo especial de bloques. TRUE si existe y es un pipe (fifo). TRUE si existe y tiene el bit set-user-ID. TRUE si existe y tiene tamao mayor que 0. Comparacin de cadenas -z <cadena> -n <cadena> <cadena1> = <cadena2> <cadena1> != <cadena2> TRUE si es una cadena vaca. TRUE si es una cadena no vaca. TRUE si ambas cadenas son idnticas. OJO hay dejar espacios a un lado y otro del signo igual para no confundir la orden con una asignacin. TRUE si son distintas.
Script
17
Script
Shell Script
[CAP 1]
<cadena>
TRUE si no es cadena nula. (Una variable que no existe devuelve cadena nula). Comparacin de nmeros
<num1> -eq <num2> <num1> -ne <num2> <num1> -gt <num2> <num1> -ge <num2> <num1> -lt <num2> <num1> -le <num2>
TRUE si ambos nmeros son iguales. TRUE si ambos nmeros son distintos. TRUE si <num1> mayor que <num2>. TRUE si <num1> mayor o igual que <num2>. TRUE si <num1> menor que <num2>. TRUE si <num1> menor o igual que <num2>. Operadores lgicos
Operador lgico NOT retorna TRUE si <expresin_logica> es FALSE y retorna FALSE si <expresin_logica> es TRUE. Operador lgico AND retorna TRUE si <ExprLogi1> y <ExprLogi2> son ambas TRUE y FALSE en caso contrario. Operador lgico OR retorna TRUE si <ExprLogi1> o <ExprLogi2> son alguna de ellas TRUE y FALSE en caso contrario. Agrupacin de expresiones
( <expr> )
Se pueden usar parntesis para agrupar expresiones lgicas. Es decir que valgan TRUE o FALSE
Ejemplos:
$ test -r /etc/passwd ; echo $? 0 $ test -w /etc/passwd ; echo $? 1 $ test -x /etc/passwd ; echo $? 1 $ test -c /dev/null ; echo $? 0 $ test -r /etc/passwd -a -c /dev/null ; echo $? 0 $ test -w /etc/passwd -a -c /dev/null ; echo $? 1 $ test -r /etc/passwd -a -f /dev/null ; echo $? 1 $ [ -s /dev/null ] ; echo $?
Script
17
Script
Shell Script
[CAP 1]
1 $ [ ! -s /dev/null ] ; echo $? 0 $ [ "$$" = "zzzzzzzzzzzz" ] ; echo $? 1 $ [ 0 -lt $$ ] ; echo $? 0 $ [ 0 -lt $$ -a true ] ; echo $?
Expresiones aritmticas -+ */% +<= >= < > == != Menos unrio y Ms unrio Multiplicacin, Divisin, y Resto Suma, y Resta Comparaciones Menor o igual, Mayor o igual, Menor, Mayor Igualdad, desigualdad Asignacin simple, Asignacin con operador (multiplicacin, divisin, resto, suma, y resta)
= *= /= %= += -=
Ejemplo: 1.- Cdigo del script echo "introduce el primer valor" read a echo "introduce el Segundo valor" read b echo "introduce el Tercer valor" read c m=$[($a+$b+$c)/3] #m=$(echo "($a+$b+$c)/3" |bc -l) echo "La media es" echo $m if [ $m -ge 11 ] then echo "Aprobado" else echo "Desaprobado" fi
Script
17
Script
Shell Script
[CAP 1]
2.- Salida
Estructuras de control
Como en cualquier lenguaje de programacin, la shell ofrece estructuras que permiten controlar el flujo de ejecucin de los scripts.
Bucle for
El bucle for sigue la siguiente notacin general :
Ejercicios Resueltos:
1.- Este programa genera nmeros consecutivos del 1 al 10 a.-Cdigo del programa for num in 1 2 3 4 5 6 7 8 9 10 do echo $num done b.-Salida
2.- Por cada usuario dado como argumento se comprueba si est conectado o no y se da
Script
17
Script
Shell Script
[CAP 1]
el mensaje apropiado a.- Cdigo del programa for i in $* do if who | grep -s $i > /dev/null then echo $i est conectado else echo $i no est conectado fi done b.-Salida
3.- Un script de ejemplo ms til es este, llamado showrpm, que muestra un resumen del contenido de una serie de paquetes RPM:
#!/bin/sh # listar un resumen del contenido de una serie de paquetes RPM # USO: showrpm ficherorpm1 ficherorpm2 ... # EJEMPLO: showrpm /cdrom/RedHat/RPMS/*.rpm for rpmpackage in $*; do if [ -r "$rpmpackage" ];then echo "=============== $rpmpackage ==============" rpm -qi -p $rpmpackage else echo "ERROR: no se pudo leer el fichero $rpmpackage" fi done
Bucle while .
Sintaxis: while [ condicion ] do comandos
done
Ejercicios Resueltos Este ejemplo permite obtener el factorial de un nmero a.- Cdigo del programa echo "Ingrese un numero" read num factorial=1 i=1 condicion=$[$num+1] while [ $i -lt $condicion ]
Script
17
Script
Shell Script
[CAP 1]
Bucle until
until [ <condicion> ] do ... done
Ejemplo 1:
x=1 until [ $x -ge 10 ] do echo "contandor simple: $x" x=$[ $x+1 ] done
Ejemplo 2:
#!/bin/sh while who |grep -s $1 >/dev/null do sleep 60 done echo "$1 est desconectado? El script verifica si el usuario que se pasa como argumento est conectado, mientras lo est el script espera 60 segundos antes de hacer una nueva verificacin. #!/bin/sh until test -f $FILE do sleep 60 done echo "$FILE now exists" Verifica cada 60 segundos si existe el fichero representado por la variable $FILE.
17
Script
Shell Script
[CAP 1]
La instruccin break termina la ejecucin del bucle mas interior causando la ejecucin de la instruccin done mas cercana. Para salir del nivel n, usa : break n, esto causa la ejecucin de la instruccin done n. El comando continue causa la ejecucin de la instruccin while, until o for en la cual comienza el bucle que contiene el comando continue.
Setencia if
Primera forma if [ <condicion> ] then ... else ... fi Segunda forma if [ <condicion1> ] then ... elif [ <condicion2> ] ... else ... fi Ejercicios Resueltos 1.- Cdigo del programa echo "Ingresa un archivo" read file if [ -f $file ] then echo "Numero de Lineas:" cat $file|wc -l else echo "No existe el archivo" fi
2.-Cdigo del programa echo "Ingresa la direccin absoluta de un archivo" read a if [ -f $a ] then echo "El archivo ya existe, Lo quieres ver s/n" read b if [ "$b"="s" ] then cat $a else exit
Script
17
Script
Shell Script
[CAP 1]
fi else echo "El archivo NO existe, Lo quieres crear s/n?" read c if [ "$c"="s" ] then cat >$a echo "Ya lo he creado" else exit fi fi Salida cuando existe el archivo ingresado
Setencia Case
El flujo del programa se controla en base a una palabra dada. Esta palabra se compara con cada patrn hasta que se encuentra uno que haga juego. Cuando se encuentra, se ejecuta el comando asociado y se termina la instruccin. case palabra-dada in patrn1) comandos ;; patrn2|patrn3) comandos ;; patrnN) comandos ;; esac
Un comando puede asociarse con mas de un patrn. Los patrones pueden separarse unos de otros con el smbolo | . El orden de chequeo es el orden en que aparecen los patrones. Para especificar un patrn por defecto se pueden usar wildcards : ? comprueba un carcter * comprueba cualquier nmero de cualquier tipo de caracteres [nnn] comprueba cualquiera de los caracteres entre corchetes [!nnn] comprueba cualquier carcter que no este entre los corchetes [n-n] comprueba cualquier carcter en el rango
Script
17
Script
Shell Script
[CAP 1]
Ejercicios resueltos 1.-Este ejemplo muestra el uso de la sentencia case. a.- Cdigo del programa case $1 in 1) echo Uno ;; 2) echo Dos ;; [3-7]) echo "Entre tres y siete ambos incluidos" ;; 8|9|0) echo Ocho; echo Nueve; echo Cero ;; [a-zA-Z]) echo Una Letra ;; start|begin) echo Comienzo ;; stop|end) echo Fin ;; *) echo 'Fallo' esac b.- Salida
2.-Ahora vamos a usar esto para escribir un script llamado smartzip que puede descomprimir ficheros comprimidos con bzip2, gzip y zip automaticamente : #!/bin/sh tipofichero=`file "$1"` case "$tipofichero" in "$1: Zip archive"*) unzip "$1" ;; "$1: gzip compressed"*) gunzip "$1" ;; "$1: bzip2 compressed"*) bunzip2 "$1" ;; *) error "El fichero $1 no se puede descomprimir con smartzip";; esac
Funciones
El uso de funciones en los scripts nos facilitara la organizacin y el mantenimiento del cdigo. Podemos definir una funcin de dos formas:
Script
17
Script
Shell Script
[CAP 1]
Las funciones suelen declararse al principio del script ya que deben ser declaradas antes de poder usarlas. Para llamar a una funcin basta con invocar su nombre y pasarle los parmetros que necesite: #!/bin/bash mi_funcion() { echo "Hola, soy la funcin." } clear mi_funcion Podemos declarar variables locales dentro de las funciones, de forma que estas variables slo puedan usarse por nuestra funcin y no por el resto del script. Para hacer esto debemos definir las variables del siguiente modo. mi_funcion() { local variable_local="valor" echo ${variable_local} } Veamos un ejemplo: #!/bin/bash mi_funcion() { local VARIABLE_LOCAL="local" echo "Hola soy la variable ${VARIABLE_LOCAL}" echo "Esta funcin ha recibido $# parmetros: $@" } clear mi_funcion {"uno","dos","tres"} echo "El valor de la variable local de la funcin es:"${VARIABLE_LOCAL} En este ejemplo le hemos pasado tres argumentos a la funcin, que son imprimidos en pantalla desde la misma funcin. Por otra parte tambin podis observar que el valor de la variable local definida en la funcin no se imprime fuera de ella.
Script
17
Script
Shell Script
[CAP 1]
Ejercicios Resueltos 1.-Un ejemplo sencillo: Construccin de un men a.- Cdigo del programa muestraopcionesmenuprin() { clear echo '1) Fecha y hora' echo '2) Calendario del ms actual' echo '3) Particiones del disco ' echo '4) Directorio actual' echo '5) Configuracion de red' echo '6) Memoria libre del sistema' echo '7) Estado de apache' echo '8) Ocupacion de todo el sistema de ficheros' echo '0) Terminar' echo echo -e "Introduzca la opcin deseada : \c" } ######################################################################### pausa () { echo echo -e "Pulse para continuar" read } ######################################################################### ############################### MAIN ################################### ######################################################################### while true do muestraopcionesmenuprin read OPT clear case $OPT in 0) exit ;; 1) date ; pausa ;; 2) cal ; pausa ;; 3) fdisk -l; pausa;; 4) pwd;pausa ;; 5) ifconfig ; pausa ;; 6) cat /proc/meminfo ; pausa ;; # Podra usarse el comando free 7) service httpd status; pausa ;; 8) df ; pausa ;; *) echo -e "Opcion erronea.\a" ; pausa ;; esac done b.- salida
Script
17
Script
Shell Script
[CAP 1]
Array
Un array es un medio de guardar un conjunto de objetos de la misma clase. Se accede a cada elemento individual del array mediante un nmero entero denominado ndice. 0 es el ndice del primer elemento y n-1 es el ndice del ltimo elemento, siendo n, la dimensin del array. Los arrays son objetos en Java y como tales vamos a ver los pasos que hemos de seguir para usarlos convenientemente
name[indice]=value El ndice debe ser mayor o igual a cero Ejemplo: Para inicializar el array de 4 enteros escribimos
numeros[0]=2 numeros[1]=4 numeros[2]=15 numeros[3]=25
name=(value1 ... valuen) Donde cada valor es de la forma [indice]=cadena Ejemplo : frutas=(manzana naranja platano) echo "Indice cero=${frutas[0]}" echo "Indice uno=${frutas[1]}" echo "Indice dos=${frutas[2]}"
Script
17
Script
Shell Script
[CAP 1]
if [ -e $2 ]; then echo "El script termin con xito" exit 0 else uso exit 1 fi
;;
Script
17
Script
Shell Script
[CAP 1]
--opc2) if [ -e $2 ]; then echo "El script termin con xito" exit 0 else uso exit 1 fi uso exit 1
;; *) ;; esac
Ejemplo2:
#!/bin/bash function lista_parametros () { echo "Se ha llamado a lista_parametros, con $#" echo "parmetros. Mostrando los parmetros:" echo " " b=7 numparms=$# local j=1 while [ $j -le $numparms ]; do echo "El parmetro $j contiene $1" shift local j=$[$j+1] done } lista_parametros a b c d dsfafd d echo $b echo $j
Ejemplo3:
#!/bin/bash # # Variables de configuracin # + Acabado en / !!!! DIRECTORIO_SALIDA=/home/camara/ # # # Funciones # function echoc() { case $2 in "red") echo -n "^[[01;31m" ;; "green") echo -n "^[[01;32m" ;; "blue")
Script
17
Script
Shell Script
[CAP 1]
echo -n $1 if test $3 = 1 then echo -n "^[[00m" else echo "^[[00m" fi } # # function comp() { echoc "[" "blue" "1" echo -n " " if test $1 = 0 then echoc "OK" "green" "1" else echoc "!!" "red" "1" fi echo -n " " echoc "]" "blue" "0" } # Main echo "Por favor, encienda la cmara y pngala en modo [|>]" echo -n "Pulse una tecla para continuar" read -n1 echo "." echo -n "Montando la cmara... " mount /camara 2>&1 > /dev/null comp $? echo "Copiando imgenes a /home/sergio/camara... " for i in /camara/dcim/100nikon/*.jpg do NUEVO_NOMBRE=`basename $i | sed s:dscn:$DIRECTORIO_SALIDA:g` echo -n " $i -> $NUEVO_NOMBRE... " cp $i $NUEVO_NOMBRE comp $? done echo -n "Desmontando la cmara... " umount /camara 2>&1 > /dev/null comp $? if [ `/etc/init.d/samba status | awk '{print $3}'` != "started" ] then echo "Iniciamos samba... " /etc/init.d/samba start 2>&1 >/dev/null comp $? else echo "Samba ya est iniciado." fi echo "Ya puede apagar la cmara con seguridad"
Script
17
Script
Shell Script
[CAP 1]
Ejemplo4:
# Visualizar los parmetros del 6 al 14 function() { shift 5 echo $1 $2 $3 $4 $5 $6 $7 $8 $9 } ## main ## funcion 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Ejemplo5:
#!/bin/sh #"while test $# != 0 ", lo mismo que abajo while [ $# != 0 ] do echo argumento $1; shift; done Esto muestra los parmetros ingresados. El comando shift hace un corrimiento de los parmetros hacia el anterior.
En el entorno grfico tenemos varias herramientas para formatear disquetes: Kfloppy (paquete kfloppy): utilidad para formatear disquetes de KDE.
Script
17
Script
Shell Script
[CAP 1]
#umountdispositivo Si sacamos el disquete sin desmontarlo puede que el kernel no haya volcado los ltimos cambios, con lo que perderemos esos datos.
Script
17
Script
Shell Script
[CAP 1]
Ejercicios propuestos
Script
17
Script
Shell Script
[CAP 1]
Ejercicio N 1 Crear los siguientes scripts. NOTA: cada script que funciona vale dos puntos 1.- Realiza un script llamado visualizador, que al llamarlo tengamos que ponerle la direccin absoluta de un archivo. Si existe, lo debe visualizar en la pantalla, si no existe, debe aparecer en la pantalla la frase: lo siento ese archivo no existe. 2.- Realiza un script llamado compara, cuando lo llamemos, nos pedir que introduzcamos una palabra, una vez introducida, nos pedir otra. Luego comparara esas dos palabras y nos deber indicar si las palabras introducidas son iguales o no. 3.-Realizar un script llamado curriculum, que al llamarlo solicite que escribas un nombre, luego un apellido, luego un ao de nacimiento. Despus de introducir lo anterios, debe escribir: Usted se llama nombre apellido y tiene aos aos 4.-Crea un script llamado papelera, que al llamarlo tengamos que ponerle un parmetro que ser el nombre de un archivo, de tal manera que ese archivo lo copiara en una carpeta llamada /home guardar. 5.- Realiza un script llamado pitagoras, que al llamarlo nos pide, primero un valor, despus de introducirlo, nos pedir otro valor y luego realizara el teorema de Pitgoras con estos valores. 6.- Realiza un script llamado clave, al llamarlo nos pedir que introduzcamos una palabra. Si la palabra introducida es sesamo, nos debe visualizar el archivo /etc/passwd, si no se acierta la palabra debe escribir : Lo siento no esta autorizado 7.- Cree un script llamado media, que al llamarlo tengamos que ponerle tres parmetros numricos y nos devuelve lo siguiente: a) Si 0<promedio<10 aparece el mensaje: MUY MAL, HAZ DESAPROBADO a) Si 10<promedio<15 aparece el mensaje: BIEN, HAZ APROBADO a) Si 15<promedio<20 aparece el mensaje: EXCELENTE, HAZ APROBADO 8.- Crear un programa que te permita comprimir y descomprimir carpetas con los formatos .tar.bzip2, tar.gzip y zip. Establece las condiciones para que funcione adecuadamente el programa. 9.- Realiza un script llamado grande, que al llamarlo tengamos que ponerle la direccin absoluta de un archivo si el archivo introducido es mayor que 200 bytes, debe escribir El archivo es demasiado grande. Si el archivo es menor debe visualizarlo con cat. 10.- Hacer un men que muestre:
El programa debe funcionar para cada una de las opciones que muestra el men. Para cada opcin(1,2,3,4,5,6) agregar los comandos de linux que haga que funcione adecuadamente el men que se muestra arriba.
Script
17