Você está na página 1de 18

PROGRAMACIN SHELL-SCRIPT EN LINUX Un Script es un fichero con un conjunto de comandos que se ejecutan secuencialmente (en orden) cuya estructura

suele ser:

#! /ruta/interprete_comando 1 linea #...linea de comentario Definicin de variables globales para todo el script (Se destruyen cuando acaba el script)
Cuerpo del script

Definicin de funciones

Definicin de variables: Las variables son no-tipificadas (no hace falta declararlas antes con el tipo de valor que van a guardar) se las define y se las asigna el valor directamente: Nombre_variable=valor Para recuperar el contenido de una variable: ${nombre_variable} $nombre_variable Pasos para crear un script: 1) Con editor creas script (gedit, nano, vim)
grfico consola

#! /bin/bash # definicion de variables,ejemplo mensaje=estamos de vuelta # variable mensaje definida echo el contenido de la variable es: $mensaje

2) Hay que poner permiso de ejecucin al script que has creado mediante comando: chmod Si quieres solo dar permiso de ejecucin al usuario: chmod u+x /ruta/nombre_script Si quieres solo dar permiso de ejecucin al usuario y al grupo: chmod ug+x /ruta/nombre_script Si quieres que todo el mundo lo pueda ejecutar: chmod ugo+x /ruta/nombre_script a 3) Para ejecutarlo: si estas en el directorio donde est el script: ./nombre_script De lo contrario: /ruta/nombre_script

Para leer variables desde el teclado: read [-opciones] variable [variable2 variable3 ] variables a las que se asigna valores desde el teclado si sus valores les separa por un espacio en blanco

(por la variables de entorno IFS Input Field Separator. Si cambias esta variable del sistema tendras que separar los valores por el nuevo carcter de IFS) [-opciones] -p -n -s -t mensaje a mostrar n caracteres modo silencioso (no muestra los caracteres) n segundos de espera

#! /bin/bash clear read p Introduce tu nombre: nom read p Introduce tus apellidos: ape echo tu nombre es: $nom y tus apellidos: $ape

echo Ahora las leemos a la vez read p Introduce nombre y apellidos separados por un espacio: nom ape echo los nuevos valores son: $nom y $ape

(mas scripts en la maquina virtual en la carpeta Scripts) Script1 y Script2

Operaciones con variables Operaciones simples con variables numricas Se utiliza el comando: expr expresin a calcular:

valor1 + valor2 valor1 valor2 valor1 \* valor2 valor1 / valor2


Entre comillas invertidas ( `) para que el resultado salga encima de la operacin. Script3 Script3.1 (con nmeros decimales El comando bc (basic calculator)) Si quieres hacer mas de una operacin aritmtica de una vez: $(( operaciones )) Script4 Operaciones con variables de tipo cadena de caracteres: Se utiliza el comando (para las mas sencillas) -

expr

Para saber el numero de caracteres de una cadena (la longitud): expr length cadena ${#cadena}

Para extraer un n determinado de caracteres de una cadena (subcadena): expr substr cadena posicin n caracteres

${cadena:posicin:ncaracteres} script 5; script5.1 ; script5.2; script5.3

Reemplazar en una cadena caracteres por otros: ${cadena/caracteres_a_reemplazar/caracteres_nuevos} solo cambia los primeros caracteres a reemplazar que encuentra ${cadena//caracteres_a_reemplazar/caracteres_nuevos} cambia todos Cambiar los caracteres de letras minsculas a maysculas en una cadena: ${cadena^} 1 letra solo que encuentra ${cadena^^} todas las letras de la cadena De maysculas a minsculas: ${cadena,} 1 letra ${cadena,,} todas las letras script6; script6.1; script6.2

Condicionales Simples if then Comando(s)_devuelven_codigo_salida_0 Comando1 Comando2 [else Comando1 Comando2 ] fi

Anidados if then Comando1 elif then Comando1 [else Comando1 ] fi script7 ; script7.1; script7.2 ; script7.3 Evaluando expresiones con comando Comando(s)_devuelven_codigo_salida_0 Comando(s)_devuelven_codigo_salida_0

test

Test [!] expresin_a_evaluar [-a | -o expresin_a_evaluar_2 a | -o ] El comando test devuelve un cdigo de salida 0 su evala todas las expresiones de forma correcta; si alguna falta devuelve cdigo salida 1. El formato de las expresiones que evala el comando test depende de lo que se quiera evaluar: para expresiones numricas test valor1 -opcion valor2 -opcion: -eq -ne -ge si valor1 = valor2 codigo salida 0

si valor1 distinto valor2 si valor1 >= valor2

-gt -lt -le

si valor1 > valor2 si valor1 < valor2 si valor1 <= valor2

script8 ; script 8.1 ; script8.2 ; script8.3

para expresiones con cadenas test z cadena devuelve cdigo de salida 0 si la cadena no tiene ningn carcter. test cadena1 = cadena2 devuelve cdigo de salida 0 si ambas cadenas contienen los mismos caracteres. test cadena1 != cadena2 devuelve cdigo de salida 0 si las cadenas tienen distintos caracteres.

script9 ; script9.1

sobre ficheros (tipo, permisos) tipo: test f /ruta/fichero devuelve cdigo salida 0 si /ruta/fichero es un fichero regular. test d /ruta/fichero devuelve cdigo salida 0 si /ruta es un directorio existente. test S /ruta/fichero devuelve cdigo salida 0 si /ruta/nombre es un socket. test p /ruta/fichero devuelve cdigo salida 0 si /ruta/nombre es una tubera personalizada (creada con mkfifo). test s /ruta/fichero devuelve cdigo salida 0 si fichero existe y tiene tamao mayor de 0 bytes test e /ruta/fichero devuelve cdigo salida 0 slo si existe (el tamao puede ser 0)

Una tubera personalizada es un almacn temporal de datos (los recoge de un comando(s) y los manda a otros)

Ej:

mkfifo /tmp/mituberia ls l /tmp

En una consola: y en otra: permisos:

cat < /tmp/mituberia echo hola >/tmp/mituberia

test -r /ruta/fichero devuelve cdigo salida 0 si /ruta/nombre tiene permiso tiene permiso LECTURA habilitado. test -w /ruta/nombre devuelve cdigo salida 0 si /ruta/nombre tiene permiso ESCRITURA habilitado. test -x /ruta/nombre devuelve cdigo salida 0 si /ruta/nombre tiene permiso EJECUCIN habilitado.

Comparacin entre ficheros: test /ruta/nombre1 -nt /ruta/nombre2 devuelve cdigo salida 0 si /ruta/nombre1 es ms reciente que /ruta/nombre2. test /ruta/nombre1 -ot /ruta/nombre2 devuelve cdigo salida 0 si /ruta/nombre1 es ms antiguo que /ruta/nombre2. test /ruta/nombre1 -et /ruta/nombre2 devuelve cdigo salida 0 si los dos se almacenan en mismo dispositivo y apuntan al mismo inodo (HARDLINK)

Enlaces a un fichero en Linux: SOFLINKS (enlaces suaves o punteros a nombre de fichero): Nombre_enlace nombre_fichero inodo HARDLINKS (enlaces duros o punteros a inodo): Nombre_enlace inodo

Para crear enlaces: Soflink: ln -s Hardlink:

ln

/ruta/fichero

/ruta/nombre_enlace_suave

ln /ruta/fichero /ruta/nombre_enlace Ej: (enlace suave) ln s /home/luis/Escritorio/prueba.txt /tmp/enlace_prueba ls l /tmp cat /tmp/enlace_prueba ls i / home/luis/Escritorio/prueba.txt ls i /tmp/enlace_prueba rm / home/luis/Escritorio/prueba.txt ls l /tmp/enlace_prueba

Ej: (enlace duro) ln /home/luis/Escritorio/prueba2.txt /tmp/enlace_prueba2 ls l /tmp cat /tmp/enlace_prueba ls i / home/luis/Escritorio/prueba.txt ls i /tmp/enlace_prueba rm / home/luis/Escritorio/prueba.txt ls l /tmp/enlace_prueba

Script10

Estructuras condicionales case expresin[|variable] in en el caso de que la expresin o variable valga valor1[|valor2|][|patrn]) comando1 comando2 ;;[|;;&] valor1[|valor2|][|patrn]) comando1 comando2 ;;[|;;&] esac

Este valor, patrnejecuta esos comandos y salta al final del case (El ORDEN en que pones los diferentes casos tiene importancia!!) a no ser que en cada caso aparezca el ;;& que hace que se sigan valorando los posibles casos que hay por debajo. Patrones de bsqueda: expresiones con caracteres especiales que indican algo: * cero o ms repeticiones de cualquier carcter en esa posicin aparece cualquier carcter

[caracter1 caracter2 caracter3 ] en esa posicin aparece un carcter de esa lista. [caracter1-caracterN] en esa posicin aparece un carcter en ese rango. [^] en esa posicin aparece justo lo contrario a esa lista/rango. Ejemplos: ls l /tmp/[Aa][Bb]??sist.* cp /home/pepe/Documentos/*.??? /tmp script 11 ; script11.1 ; script11.2 ; script11.3

Comando para hacer bsquedas: Grep [-opciones] expresion buscar /ruta/nombre.fichero busca linea a linea la expresion a buscar; si la encuentra te muestra la linea Ej: grep root /etc/passwd

La expresin a buscar admite patrones de bsqueda si pones opcin: -e patrn_bsqueda si en una lnea del fichero se ajusta a ese patrn, grep la muestra los caracteres que se pueden poner: ^ $ . * + ? principio de lnea final de lnea cualquier carcter en esa posicin cero o ms repeticiones del carcter/expresin anterior una o ms repeticiones del carcter/expresin anterior el carcter/expresin anterior es opcional (aparece 0 o 1 vez)

[caracter1 caracter2] en esa posicin puede aparecer un carcter de esa lista [caracter1-caracterN] en esa posicin puede aparecer un carcter dentro de ese rango [^caracter1 caracter2] en esa posicin NO puede aparecer un carcter de esa lista [^carcter-caracterN] en esa posicin NO puede aparecer un carcter dentro de ese rango {n} el carcter/expresin anterior se repite exactamente nveces {n1, n2} el carcter/expresin anterior se repite entre n1 y n2 veces {n1, } el carcter/expresin anterior se repite ms de n1 veces (expresin) agrupan patrones que pueden hacerse referencia despus para no repetirlos mediante \n parntesis Ej: grep e ^root:x:.* /etc/passwd grep e ^.*:x:[0-9] [0-9] [0-9]:.* /etc/passwd ste ultimo es lo mismo que poner: grep e ^.*:x: [0-9]\{3\}:.* /etc/passwd

ls l /home/luis/Documentos | grep e ^-[rwx][rw][rw]------.*

Ms opciones: -v grep muestra aquellas lneas que NO CONTIENEN la expresin a buscar

-i no distingue MAYSCULAS de minsculas -n te muestra el n de lnea donde se ha encontrado la expresin a buscar num_linea: lnea -A n te muestra n lneas que existen DESPUS de cada lnea donde haya encontrado la expresin -B n te muestra n lneas que existen ANTES de cada lnea donde haya encontrado la expresin Ej: grep n e ^root:x:.* /etc/passwd grep A 3 e ^root:x:.* /etc/passwd script12 BUCLES conjunto de comandos que se repiten cclicamente un nmero exacto de veces o hasta que se cumple una condicin. Bucles Condicionales: conjunto de comandos que se repiten MIENTRAS se cumple una condicin (bucle WHILE) conjunto de comandos que se repiten HASTA que se cumple una condicin (bucle UNTIL) while/until expresin_devuelve_codigo_salida_0 do comando1 comando2 [break] rompe de forma abrupta el bucle y sale fuera de l a la siguiente instruccin despus del done. done script13 ; script13.1 ; script13.2 ; script13.3 ; script13.4 ; script13.5 ; script13.6

Bucles for (para) ejecutan un conjunto de instrucciones un determinado nmero de veces fijo. for do comando1 comando2 [break] done script14 ; script14.1 ; script14.2 variable in lista_de_valores valores separados por un espacio pueden literal en poner o blanco. de mediante Se un forma

comando o comandos que genere la lista.

Comando(s) para separar campos en las lneas de un fichero por un carcter delimitador: 1) cut [-d carcter delimitador] Por defecto, sino lo especificas toma SPC TAB f n1,n2, Seleccionas la(s) columnas de la lnea que quieres mostrar con cut en funcin del carcter delimitador

Ej: cut d : cut d : f 1 /etc/passwd

-f 1,3,4 /etc/passwd

grep e *.:x:[0-9]\{3,\}:.* /etc/passwd | cut d : f 1,3,4 ls l | cut d TAB f 1

2) Awk Script14.3 Script15 Bucles fijos conjunto de commandos que se ejecutan un n fijo de veces. for do comando1 comando2 [break] [continue] done script16 ; script16.1 ; script16.2 ; script16.3 ; script16.4 ; script16.5 (( variable=valor inicial; variable sea ese n veces; incremento_variable ))

Arrays en scripts Linux Un array es un conjunto de variables que se referencian con el mismo nombre de variable y slo se distinguen por un ndice (un nmero) que marca la posicin en el array. variable1
posicion0 posicion1 posicion2

variable2

posicion3 posicion4 posicion5

variable

Los arrays son tiles para almacenar valores que tienen relacin entre s, en vez de meterlos en variables independientes los metes en un array. 1) Declaracin de un array antes de utilizarlo: declare a nombre_array 2) Utilizamos el array dando valores a cada posicin: nombre_array[posicin]=valor nombre_array=( [posicion1]=valor [posicion2]=valor ) 3) Para ver el contenido de una posicin del array: ${nombre_array[posicin]} Para mostrar todo el array: ${nombre_array[*]} La longitud del array (nmero de elementos que tiene definidos): ${#nombre_array[*]} script17 ; script17.1 Puedes crear un array a partir de un comando o comandos que te generen una lista de valores: nombre_array=( `comando(s)` ) script17.2 ; script17.3 ; script17.4 ; script17.5 ; script17.6

Funciones en scripts Conjuntos de instrucciones que se ejecutan cuando invocas el nombre que las contiene (nombre de la funcin) Definicin funciones:

function nombre_funcion( ) defines variables locales para los comandos de la funcion (no se ven fuera)

{ [local variable] comando1 comando2

Cdigo de salida que se puede escoger tras invocar la funcin

[return valor]

} Llamada a una funcin: Como si fuera un comando en el script pones el nombre de la funcin. Puedes pasar valores a la funcin: nombre_funcion valor1 $1 script18 ; script18.1 valor2 $2 valor3 $3 valorn $n

Creacin de DEMONIOS (Servicios) en Linux En el arranque del sistema UPSTART (padre de todos los procesos) se encarga de ir arrancando los servicios en funcion de eventos que va provocando el Kernel ( man upstart-events ) Todos los servicios estn en /etc/init nombre_servicio.conf conjunto de comandos que UPSTART puede interpretar (man upstart) En ficheros con el nombre del servicio acabados en .conf

Você também pode gostar