Shell Linux Ejemplos
Shell Linux Ejemplos
- El shell El shell es un programa cuyas funciones podemos definir como: a) Intrprete de rdenes del sistema operativo (S.O.). Acepta los comandos y se encarga de su ejecucin. Permite la comunicacin entre el usuario y el S.O. El shell recibe el comando y lo analiza; si es un comando interno de la shell (cd, echo, set, eval, etc.) lo ejecuta, en caso contrario lo busca en el sistema de ficheros ( /bin /sbin /usr/bin /usr/sbin ...), cede el control al kernel para que los ejecute, y devuelve los resultados al usuario. Cuando ejecutamos un comando el shell busca el fichero en los directorios especificados en la variable de entorno PATH, no mira en el directorio actual. Si estamos en el directorio y queremos ejecutar el shell script miConfig tendremos que escribir # ./miConfig Para evitar esto basta con editar el fichero /etc/bashrc u otro script de inicio y aadir a la variable PATH un punto. /etc/bashrc -------....... PATH=:. ....... Si hubiese otro fichero llamado miConfig en los directorios especificados en PATH, p.e. en /bin, ejecutar ste y no el situado en , ya que el punto lo hemos puesto en ltimo lugar.(En MSDOS primero busca en el directorio actual y despues en los directorios especificados en el PATH). Se entiende por el directorio raiz del usuario. b) Lenguaje de Programacin, presenta caractersticas de lenguaje de programacin interpretado de alto nivel a escala completa. Es el equivalente en concepto a los .BAT de MSDOS pero mucho ms completo y poderoso. Posee estructuras de control if, case, for, while, variables, parmetros, etc. A los programas shell se les suele denominar shell-scripts o guiones shell. Un guin-shell es un fichero que contiene uno o ms comandos. Para crear el fichero se utilizar alguno de los editores del S.O. tales como vi, emacs, etc. El interprete shell ejecutar las instrucciones una a una o bifurcar a la instruccin que corresponda segn la condicin especificada en una estructura de control. Si se encuentra un error interrumpe la ejecucin. Numerosas herramientas de administracin del sistema estn escritas con guiones shell.
El shell permite que cada usuario particular cree su propio entorno, adecuado a sus necesidades de trabajo e independiente del entorno del resto de los usuarios del sistema. 1.2 - Tipos de Shell Linux soporta varios intrpretes de rdenes o shells. Hasta que en 1983 ATT estandariz el shell, cada UNIX cre su propia versin con caractersticas particulares. sh, llamado Bourne Shell es el shell estandarizado por ATT, y bash es el ms usado en linux ya que incorpora lo mejor de sh, ksh y tcsh. Cuando un usuario entra en el sistema, se le asigna un shell para trabajar con el S.O. En /etc/passwd a cada usuario se le asigna el interprete de ordenes que va a utilizar para comunicarse con el S.O. /etc/passwd garza:x:14500:14000:Garza:/home/garza:/bin/bash 1.3 - Procesos Al conectarse el usuario garza se ejecuta el interprete de comandos y crea un proceso de conexin (proceso padre de usuario). Todos los procesos que se creen a continuacin, por parte del usuario, sern procesos hijos del proceso padre, ste pasa a un estado de espera y cuando el proceso hijo finaliza, el proceso padre pasa al estado activo y aparece de nuevo el prompt. A cada proceso generado en el sistema, se le asigna un nmero de identificacin conocido como PID y un nombre que corresponde al del programa activo dentro de l. Cada proceso creado en el sistema tendr como dueo al usuario que lanz la ejecucin del comando original. Todos los procesos tienen un proceso padre identificado con PPID, si haces un ps -lx | more vers que init tiene como PPID un 0, init es el proceso padre de todos los procesos. 1.4.- Como ejecutar un guin-shell. Veamos un ejemplo prctico, creamos con nuestro editor favorito el siguiente shell script: $ vi miConfig alias rm="rm -i" alias cp="cp -i" clear pwd df -a PATH=;/home/garza/HTML Puede ser ejecutado de varias formas: a) $ sh miConfig b) $ miConfig Es necesario que el fichero miConfig tenga permisos de ejecucin.
c) $ . miConfig Al igual que el caso anterior necesita permisos de ejecucin, el punto hace que al finalizar el guin-shell no volvamos al entorno de trabajo en el que nos encontrabamos, sino que conservaremos el entorno que nos ha dejado el programa miConfig. El proceso padre hereda el entorno del proceso hijo. (Entendemos por entorno el conjunto de variables y funciones del shell). En realidad el punto lo que hace es que no se crea un proceso hijo. En el ejemplo, al finalizar la ejecucin de . miConfig los alias y la variable de entorno PATH queda con el valor especificado en el guin. En los ejemplos a) y b), al finalizar la ejecucin la variable PATH queda con el valor que tuviese antes de la ejecucin.
2. El Shell como intrprete de rdenes 2.1 Entrada y salida estndar. El canal de entrada para una orden se conoce como entrada estndar (stdin) y el canal de salida se denomina salida estndar (stdout), tambin existe un canal de salida para los errores (stderr). Generalmente las rdenes se introducen mediante el teclado (stdin) y su resultado se visualiza en la pantalla (stdout), sin embargo, se puede redirigir la entrada y la salida estndar a ficheros. Ejemplos : $ cat /etc/passwd > /etc/passwd.seg El operador > redirecciona la salida estndar a un fichero, en este caso llamado passwd.seg, si no existe lo crear y si existe lo destruye antes de escribir la salida de la orden en l. $ echo "garza:x:14500:14000:GarZa:/home/garza:/bin/sh" >> /etc/passwd El operador >> es idntico al anterior, slo que no es destructivo, la salida de echo se aade al final del fichero /etc/passwd. $ mail rperez < nota El operador < redirige la entrada estndar para que provenga de un fichero, en el ejemplo el fichero nota es la entrada de la orden mail rperez $ cat nota1 - nota3 > nota4 El operador - es utilizado para tomar la entrada estndar en ese punto. En el ejemplo, cat procesa nota1, pasa a la entrada desde teclado, y procesa nota2, y las tres entradas se redirigen al fichero nota4. $ cat nota1 2> /dev/null Si el fichero nota1 no existe devolver a la pantalla un mensaje de error, si no queremos ver los errores utilizar el canal de salida para errores, 2>. En este caso al redireccionar a /dev/null el mensaje de error se destruye, si nos interesa conocer el error podemos redireccionar a un fichero y procesarlo ms tarde. 2.2 Tuberas. Antes veamos como redireccionar la entrada o salida estandar a un fichero, ahora lo que vamos a ver como la salida de una orden se puede dirigir a la entrada de otra orden. Esto se hace mediante el operador | llamado pipeline.
$ ps aux | grep "httpd" La salida de la orden ps es procesada por la orden grep, en pantalla slo aparecern los procesos httpd. 2.3 Otros operadores Hay numerosos caracteres que poseen un significado especial para el shell: * Sustituye cualquier grupo de caracteres, excepto cuando el primer carcter del grupo es un punto. p.e. # ls -l PRO* 'lista todos los archivos que su nombre empiecen por PRO ? Sustituye Un carcter. # ls ??R 'lista todos los archivos que en su tercera posicin del nombre tengn una R. Indicador de procesos background.
&
; Separador de comandos. Pueden ejecutarse varios comandos en la misma lnea, separados del operador ; p.e. # clear ; ls -la \ $ # Indica que el comando sigue en la siguiente lnea. Hace referencia al contenido de una variable. comentarios, son lineas que no son procesadas en un guin shell. Acentos graves. La salida estndar de un comando se le asigna a una variable
`comando` de entorno.
"cadena" o 'cadena' Para cadenas. 3.- El shell como lenguaje de programacin 3.1.- Variables del entorno 3.1.1 Asignacin de un valor a una variable Son cadenas de caracteres de la forma NOMBRE_VARIABLE=valor. El nombre de la variable puede ser cualquier cadena de caracteres que no incluya el signo $ y que no lleve espacios en blanco. Por convenio el nombre se escribe en maysculas pero no es necesario. El valor puede ser cualquier cadena de caracteres incluidos espacios en blanco, en tal caso deber ponerse entre comillas. p.e.: # CIUDAD=Jaen #CIUDAD="Ciudad Real" # CODPOSTAL=14013
Para visualizar el valor de una variable hay que utilizar el caracter especial $: # echo Ciudad Real # Al declarar una variable si ya est en uso, el shell cambiar el valor de esa variable por el nuevo. En el anterior ejemplo el valor de la variable CIUDAD es Ciudad Real, el valor Jaen ha sido destruido por el shell. En un guin shell para asignar un valor a una variable mediante el teclado usar la orden read: echo "Introduzca su nombre " read nombre echo La entrada por teclado es asignada a la variable nombre. 3.1.2 Acentos graves. Mediante los acentos graves podemos asignar a una variable el resultado de la ejecucin de un comando: # ESTOY_EN=`pwd` # echo /home/garza # Ejecuta el comando pwd y el resultado lo asigna a la variable ESTOYEN. Al conectarnos a nuestro login y ejecutar la orden env nos aparecer en pantalla una lista de variables de entorno, stas estn asignadas por el sistema y son utilizadas por el shell y por las aplicaciones. 3.1.3.- Comillas dobles y simples Veamos dos ejemplos: # QUIENSOY="Soy el usuario " # echo Soy el usuario garza # La variable de entorno es sustituida por su valor al utilizar el $ y comillas dobles
# COM_SIMPLES='La variable es una variable asignada por el sistema' # echo La variable es una variable asignada por el sistema Las comillas simples impiden que sea evaluada, es tomada como cadena de caracteres. 3.1.4.- El comando export El comando export se utiliza para que el valor asignado a una variable sea conocido por todos los procesos hijos del proceso padre. p.e. # APF=/opt/apf/bin Si a continuacin ejecutamos un guin shell que use la variable APF, fallar ya que no la conoce. # APF=/opt/apf/bin # export APF Todos los procesos hijos heredan las variables exportadas del proceso padre. 3.1.5.- Paso de Parmetros Son variables cuyo valor es pasado a un guion shell para su posterior proceso. Los nombres de estas variables son $1, $2 ... hasta $9. Creamos el siguiente guin shell y le asignamos permiso de ejecucin: imprime --------echo $1 echo $2 Desde el shell ejecutamos el guin y le pasamos dos valores de variables que son procesadas por el guin mediante $1 y $2. # imprime hola mundo hola mundo # $# - indica el nmero de parmetros pasados al guin shell. $* - devuelve los valores de todos los parmetros $0 - devuelve el nombre del guin shell Ejemplos: 1) Devuelve el nmero de parmetros (10) y los lista. cuenta 1 2 3 4 5 6 7 a b c
----------------------echo "Nmero de parmetros $#" for NUM in $* do echo done 3.2.- Instrucciones condicionales El shell, como lenguaje de programacin, nos permite evaluar expresiones y hacer depender la ejecucin del programa de dicha evaluacin. Existen distintas estructuras de control que permitirn llevar a cabo ejecuciones no secuenciales sino en funcin de la evaluacin de condiciones. (if, case, while, until, for, ...). Para evaluar una condicin podremos usar: a) test <expresin> b) [ expresin ] Los corchetes deben de estar rodeados por espacios en blanco, al igual que los operadores de la expresin. En ambos casos, se comprobar la expresin, y si es cierta devolver un 0 y si es falsa un valor distinto de 0. ste valor se almace en la variable especial $?. Posibles expresiones: Para ficheros: -r <fichero> Es Verdadero si el fichero existe y se puede leer -w <fichero> Es Verdadero si el fichero existe y se puede escribir en el -x <fichero> Es Verdadero si el fichero existe y es ejecutable -f <fichero> Es Verdadero si el fichero existe -d <directorio> Es Verdadero si es un directorio -s <fichero> Es Verdadero si el fichero existe y tiene un tamao mayor que cero. Para cadenas: -z cadena Es Verdadero si la longitud de la cadena es cero. -n cadena Es Verdadero si la longitud de la cadena es distinta de cero. cadena1 = cadena2 Verdadero si las dos cadenas son iguales (atencin a los espacios en blanco). cadena1 != cadena2 Verdadero si las cadenas son distintas (atencin a los espacios en blanco). cadena Verdadero si la cadena no es nula Para operaciones aritmticas
-eq Igual -ne Distinto -gt Mayor que -lt Menor que -ge Mayor o igual -le Menor o igual Operadores lgicos AND: && -a OR: || -o NOT: ! La orden true devuelve un 0, se emplea en estructuras repetitivas. La orden false devuelve un valor distinto de 0, igual que true se emplea en estructuras repetitivas. Ejemplos: 1) Si la variable existe y no es nula entonces devuelve un 0 y se ejecuta la rama then, en caso contrario devuelve un valor distinto de 0 y se ejecuta la rama else if test ; then echo "Variable FIG definida" else echo "Variable FIG no definida" fi 2) Igual ejemplo que el anterior pero usando corchetes if [ ] ; then echo "Variable FIG definida" else echo "Variable FIG no definida" fi 3) Comprueba el valor de retorno, si mkdir se ejecuta con exito devuelve un 0, caso contrario un valor distinto de cero. mkdir /home/informat RETORNO=$? if [ = 0 ] then echo "Directorio creado" else echo "No se pudo crear el directorio" fi
La orden expr adems de utilizarse para operaciones aritmticas, tambin se emplea para evaluar expresiones, disponemos de los siguientes operadores: = igual != distinto \> mayor que \< menor que \>= mayor o igual que \<= menor o igual que Si la condicin es cierta devuelve un 1 y si es falsa un 0. Ejemplo a=3 echo -n "Introduzca un valor del 1 al 5" read respuesta if [ `expr = ` = 1) ; then ;#equivalente a if [ = ) ; then echo "Ha acertado, ha pulsado el nmero 3" else echo "Nmero incorrecto, vuelva a intentarlo" fi 3.3.- Estructuras de control 3.3.1 Sentencia if if <condicin> then inst1 inst2 .... fi Si se cumple la condicin se ejecutarn el bloque de instrucciones de la rama then. If <condicin> then inst1 inst2 ... else inst10 inst11 .... fi Se evala la condicin y si se cumple se ejecutan las instrucciones de la rama then, si no se cumple se ejecutan las instrucciones de la rama else.
if <condicin1> then instrucciones1 elif <condicion2> then instrucciones2 else instrucciones3 fi Se evala condicin1, si se cumple se ejecuta la rama del then, si no, se evala condicin2, si se cumple se ejecutarn las instrucciones2 y si no se cumple la rama else (instrucciones3). elifes equivalente a un else if: if <condicin1> then instrucciones1 else if <condicion2> then instrucciones2 else instrucciones3 fi fi 3.3.2 Sentencia case case $variable in valor1) instruccion1;insruccion2; ...;; valor2) instruccion1 instruccion2 instruccion3;; *) instruccion44;....;; esac Evala el valor de una variable y ejecuta varias instrucciones en funcin de su valor. Es equivalente a usar ifs anidados, aunque ms completo y organizado. Si la variable no es igual a ninguno de los valores especificados, se ejecutan las instrucciones especificadas en el asterisco.
3.3.3 Sentencias while y until while <condicin> do instruccin1 instruccin2 ..... done
until <condicin> do instruccin1 instruccin2 ..... done Usando true podemos crear bucles infinitos, para salir del bucle utilizaremos la orden break, la orden exit finaliza la ejecucin de un guin shell y sleep <segundos> hace una pausa por el tiempo indicado. while true do ....... if [ = 1 ] then break fi instruccin10. ..... done instruccin200 ....... ....... El bucle se ejecutar hasta que la variable sea igual a 1, entonces se el shell procesar la orden break y pasar a ejecutar la siguiente instruccin en la que termina el bucle. (instruccin200). Tambin podemos interrumpir la ejecucin de un bucle, y hacer que vuelva al principio del mismo, mediante la orden continue. Ejemplos: 1) Ejemplo con un while true y case while true do clear echo;echo;echo;echo;echo echo "--------------------------------------------------" echo " MANTENIMIENTO DE USUARIOS " echo "--------------------------------------------------" echo " 1 - Alta de usuarios " echo " 2 - Baja de usuarios " echo " 3 - Salir" echo "--------------------------------------------------" echo -n "Elija una opcin > " read respuesta
case in 1) instrucciones_alta;; 2) instrucciones_baja;; 3) break;; default) echo "Opcin no vlida" sleep 4 ;; esac done 2) Lee el fichero y lo procesa fila a fila. while read fila do echo done < nombre_fichero 3.3.4. Sentencia for for variable in valor1 valor2 valor3 valor4 .... do instruccin1 instruccin2 ...... done Ejemplos: 1) La varible num ir tomando los valores indicados en in, y el bucle se repetir tantas veces como valores especificados. Imprime la lista 1 2 3 4 5, el bucle se repetir 5 veces. for num in 1 2 3 4 5 do echo done 2) El * sustituye a los ficheros del directorio actual. for VAR in * do echo done 3.4 #!/bin/sh En la primera lnea de los guiones shell, suele emplearse la orden #!/bin/sh , esto fuerza a que el guin se ejecute bajo el shell sh, con esto se garantiza que su ejecucin sea independiente del shell que haya elegido el usuario, siempre se ejectarn con el intrprete sh.
3.5 Funciones Son guiones shell pero que en vez de almacenarse en un fichero se carga en el entorno. Ejecutando la orden set veremos las variables del entorno y funciones definidas. Para crear una funcin hay dos mtodos: a) Desde el shell: # nombre_funcion () { > instruccin1 > instruccin2 > ...... >} # b) Almacenar la funcin en un archivo: Ejemplos: 1) Crea una funcin desde la shell # busca () { > find . -name $1 -print | more >} # 2) Creamos el fichero fun y escribimos en l: busca () { find . -name $1 -print | more } Para cargar la funcin en memoria (no olvidar el punto): # . fun Para usar la funcin, independientemente del mtodo usado para crearla: # busca <fichero> Es habitual aadir nuestras funciones a /etc/bashrc, de modo que se carguen en el entorno cuando el usuario se identifique. Busca en la entrada, lneas que concuerden con el patrn dado. Cualquier meta-carcter con un significado especial debe ser protegido precedindolo con una barra inclinada inversa (\ ). Algunos patrones de grep se encierran entre '..' (apstrofos) para indicarle que no es un metacarcter del sehll. Tambin existe en su versin zgrep
grep [opciones] 'patrn' archivos grep "ejemplo" * listara las lineas que concuerden con la cadena ejemplo de "todos" los archivos del directorio actual grep -i hola pp.txt considera idnticas las maysculas y minscula en la cadena de bsqueda hola. (hola=HOLA=Hola=etc.). grep -ri "hola" ./ busca en los archivos del directorio actual y los subdirectorios la palabra hola grep -v hola pp.txt lista las lneas que NO contengan la cadena hola del archivo pp.txt grep -n hola pp.txt Las lneas concordantes con la cadena hola del archivo pp.txt se mostrarn acompaadas del nmero de lnea. grep -w sobre pp.txt listara solamente aquellas lneas que contienen concordancias que forman palabras completas. grep -A 2 hola pp.txt Muestra 2 lneas de contexto despus de las que concuerden con el patrn hola. grep -B 2 hola pp.txt Muestra 2 lneas de contexto antes de las que concuerden con el patrn. grep -f patron.txt pp.txt Obtiene el patrn de fichero patron.txt y listara lneas concordantes del archivo pp.txt grep -s "ejemplo" * Suprime los mensajes de error sobre ficheros que no existen o no se pueden leer. grep [123] pp.txt listara las lineas que contengan los nmeros 1, 2 o 3 grep '^L' pp.txt lista las lineas de pp.txt que comiencen la lnea con el carcter L, el carcter ^ denota inicio de cadena. grep '$h' pp.txt lista las lneas de pp.txt que terminen en h, el carcter $ denota fin de cadena. grep '\<pe' pp.txt muestra todas las lneas de pp.txt que contengan palabras que comiencen con la cadena pe grep '\>pe' pp.txt muestra todas las lneas de pp.txt que contengan palabras que finalicen con la cadena pe grep 'xy*' pp busca en pp una x seguida por la secuencia ms larga de y
grep '^[^#]' pp.txt muestra pp.txt, ocultando las lneas que empiezan por # o lneas vacas. grep -o Muestra solo la parte de la linea que coincide con el patrn grep --color=always '\bing[[:space:]]' pp.txt | less -R la palabra ing seguida de un espacio sera coloriada y esta redirigida al comando less sin perder el color. grep -Eio '([[:alnum:]_.-]+@[[:alnum:]_.-]+?\.[[:alpha:].]{2,6})' archivo.txt muestra solo las direcciones de e-mail (no todo la linea que la contiene), del archivo.txt Extrae las partes seleccionadas de cada fichero en la salida estndar cut -d " " usa un espacio, en vez del carcter tabulador para delimitar los campos cut -f 11 selecciona solamente el campo 11 ifconfig | grep HW | cut -d " " -f 11 muestra la direccin MAC
http://francisconi.org/linux/comandos/grep