Consultoría Informática: Programas a medida, Páginas web, Tiendas Online, Posicionamiento en Internet (SEO), Accesibilidad, Usabilidad...

Productos destacados

Shell Script UNIX

Capítulo I. Introducción y repaso (Sistemas Operativos I)

1. Introducción

En este punto vamos a ver los comandos vistos en 1er curso de Ingeniería Informática de Sistemas que van a ser usados en programación en shell.

1.1. Comandos básicos

mkdir: Creación de un directorio

rmdir: Eliminado de un directorio (solo si está vacio)

cd: Cambiamos de directorio

pwd: Nos indica el directorio actual.

ls: Muestra el contenido del directorio local. Opciones:

  • -l: muestra los detalles.
  • -a: muestra los archivos ocultos.
  • -al: -a y -l simultáneamente

1.2. Comandos para el uso de archivos

cp ruta_origen ruta_destino: comando para copiar ficheros.

mv nombre_inicial nombre_final: comando para renombrar un fichero.

rm nombre_fichero: elimina el fichero.

rm -r directorio: permite eliminar un directorio aunque no esté vacío.

1.3. Tipos de ficheros en unix

En unix tenemos dos tipos de ficheros, los ordinarios (ficheros de datos, texto, ...) y los directorios, que son un tipo especial de fichero que puede contener mas directorios y ficheros ordinarios.

2. Operadores de redirección

El operador > redirige la salida del comando que está a su izquierda hacia el fichero que está a su derecha. A la izquierda tendremos un comando y a la derecha un fichero.

Ej: ls > fichero1

Si el fichero no existe lo creará y si existe lo "machaca".

El operador >> redirige la salida del comando que está a su izquierda al final del fichero que está a su derecha, de tal manera que si el fichero ya existe pues simplemente añade líneas al final del mismo y si no existe, lo creará.

En el operador <, la entrada del operador a la izquierda la toma del fichero de la derecha.

Ej: mail destinatario < fichero_mensaje

Las tuberías (pipes) provocan que la salida del comando a la izquierda sea la entrada del comando a la derecha.

Ej: cat fichero | sort (muestra el fichero y además muestra sus líneas ordenadas)

3. Filtros

3.1. cut

Es un filtro que nos permite cortar un fichero y obtener alguna serie de sus campos, los cuales han de estar diferenciados o delimitados por algún tipo de carácter. Ejemplo: nombre_login:contraseña:PID:GID:

Sintaxis: cut -d(carácter separador de campo) -fx nombre_fichero

X=nº de la columna que queremos cortar

Ejemplo: cut -d: -f1 prueba

cut -d: -f1,2 prueba (obtendríamos el campo 1 y el campo 2)

3.2. head

Muestra las n primeras lineas de un fichero:

head -n fichero

En este caso la entrada es el fichero "fichero" pero también podemos escribir head -n "a secas", entonces la entrada sería la entrada estándar (teclado), hasta que pulsáramos CTRL + D.

3.3. tail

Muestra las n últimas líneas:

  • tail -n fichero: Muestra las n últimas líneas de un fichero.
  • tail +n fichero: Muestra de la n en adelante líneas.

3.4. cat

Toma una entrada y la muestra por la salida. Es como un filtro nulo. Si ponemos solo cat, lo que escriba por teclado, saldrá por pantalla.

3.5. uniq

Elimina las líneas que se repiten. Para trabajar con este filtro tenemos que tener todas las líneas que se repiten consecutivamente almacenadas, es decir, que tendremos que utilizar el comando sort que veremos más adelante.

uniq [opciones] entrada salida

Opciones:

  • - u: Saca sólo las líneas que no se repiten.
  • -d: Saca sólo las líneas que se repiten, pero sólo saca una copia de las mismas.
  • -c: Saca en la columna de la izquierda el número de veces que se repite y en la columna de la derecha la línea propiamente dicha.

3.6. tr

Traduce caracteres de un archivo de una forma a otra.

tr [opciones] de_cadena a_cadena fichero

3.7. tee

Permite dividir la salida de un comando para que por un lado quede almacenada en un fichero y por otro vaya a la pantalla. Ejemplo: ls | tee fichero ? Saldría por pantalla y se grabaría en el fichero llamado "fichero".

3.8. sort

Permite ordenar ficheros de texto.

sort [opciones] archivo

Podemos ordenar por campos lógicos o por columnas. Ahora las columnas las empezamos a numerar desde 0 y no desde 1 como hacíamos en el filtro cut. Opciones:

  • -t: donde los dos puntos es el carácter separador de campo.
  • -r hace una clasificación descendente.
  • -n permite ordenar números
  • -b para que no tenga en cuenta los espacios en blanco
  • -o permite especificar un fichero de salida en el cual quedarán grabados los datos ordenados. Ej: sort fichero1 –o fichero2 ó sort fichero1 –o fichero1 (quedaría el resultado almacenado en el mismo fichero)

sort –t: +1 practica3 ? ordenaríamos el fichero "practica3" que tendrá como caracteres separadores de campo los “dos puntos” y lo ordenaremos teniendo en cuenta la segunda columna (ya que empezamos a numerar 0, 1, 2, …)

3.9. find

Permite buscar ficheros que cumplan determinadas características. No tenemos en cuenta el contenido del fichero.

  • - name nombre ? Nos busca los ficheros que coincidan con un determinado nombre o patrón de búsqueda
  • - type d ó f: nos dice si es un fichero normal o un directorio
  • - user nombre_login ? Nos busca los ficheros de un determinado propietario
  • - exec nos permite ejecutar un comando por cada uno de los ficheros encontrados

3.10. paste

Es lo contrario al cut. Permite producir una salida en forma de columnas desde uno o más ficheros.

paste fichero1 fichero2 ? hace una línea por cada pareja de líneas de los ficheros fuente.

Si no ponemos nada hace una fabulación como carácter separador, pero si ponemos –d: pues pone los “dos puntos” de carácter separador de campo.

3.11. egrep

Sirve para buscar cadenas o patrones dentro de un fichero. El sistema devuelve la línea o líneas que contiene el patrón de búsqueda.

Ej: grep pepe fichero

Expresiones regulares mas usadas:

  • ^cadena: la cadena aparece al principio de la línea
  • cadena$: la cadena aparece al final de la línea

egrep -v patron fichero: Saca las líneas que no contienen un patrón determinado.

3.12. sed

Comando que sirve para sustituir palabras o patrones dentro de un fichero.

sed “s/cadena_original/cadena_nueva/g”

Para eliminar una cadena:

sed “s/cadena_a_borrar//g”

3.13. wc

wc [opciones] fichero

El comando wc realiza un recuento de un fichero de texto, puede contar líneas, caracteres o palabras, dependiendo de la opción que utilicemos.

Opciones:

  • -w ? Cuenta palabras
  • - c ? Cuenta caracteres
  • - l ? Cuenta líneas

Capítulo II. Programación en shell de UNIX

1. Introducción

La programación en shell de unix surgió como respuesta a las tareas que se realizaban secuencial mente para conseguir hacer algo con el sistema. Como esas tareas se realizaban muchas veces y prácticamente en el mismo orden, pues surgió esto, que lo que hace es ejecutar secuencial mente ordenes en el intérprete de comandos sin tener que escribirlos “a mano”. Es algo parecido a los antiguos ficheros .bat de MS-DOS.

Nosotros usaremos Bourne Shell (sh) puesto que hay muchas modalidades de shell en unix. Para que el sistema siempre interprete que utilizaremos Bourne Shell tendríamos que añadir al principio de nuestro script la línea #!/bin/sh

2. Variables

Las variables en la shell de unix no necesitan ser declaradas previamente para su posterior utilización. Las variables tienen un nombre y para acceder a su contenido tenemos que anteponer el ‘$’ al nombre de la variable. Ejemplos:

  • variable1=2
  • echo variable1: Sacará por pantalla la cadena variable1
  • echo $variable1: Como hace referencia a su contenido, sacará un 2


Hay un tipo de variables que se denominan variables de entorno que son definidas por el sistema al iniciar la sesión y algunas serán diferentes para cada usuario (PATH, LOGNAME, …).

3. Paso de argumentos a un script

El paso de parámetros se realiza escribiéndolos en la línea de comandos detrás del nombre del script. Dentro del mismo podremos acceder a los parámetros con las variables $1, $2, $3, … hasta $9.

Ej: sh script1 hola que tal adiós

Dentro del script:

  • $1 = hola
  • $2 = que
  • $3 = tal
  • $4 = adiós

Con el comando shift dentro de un script logramos un desplazamiento de los parámetros, entonces en este caso quedaría así:

  • $1 = que
  • $2 = tal
  • $3 = adiós

Podemos observar que ‘hola’ se habría perdido. El comando shift es el que me permite pasarle más de 9 parámetros a un script, puesto que el $10 nunca lo podremos utilizar.

Las variables $# y $* usadas dentro de un script tienen un significado especial:

  • $#: Contiene el número de parámetros pasados al script.
  • $*: Contiene todos los parámetros pasados al script.

4. Lectura de una variable desde teclado. Read

Utilizamos read nombre_variable. Tambien podemos leer más de una variable a la vez. Ejemplo:
      read var1 var2. Entonces la entrada si es, 1 2, pues tendremos:
      $var1 = 1
      $var2 = 2

5. Expresiones. Comando expr

expr permite evaluar una expresión:

  • +
  • -
  • \*
  • /
  • %

ejemplo: c=`expr $a + $b`

En c se almacenaría el valor de evaluar la expresión a + b, es decir, su suma.

6. Condiciones

test permite realizar comparaciones lógicas.

- comparaciones numéricas:

  • = -eq
  • < -lt
  • <= -le
  • <> -ne
  • > -gt
  • >= -ge

test $a –ne $b

- cadenas

= (con espacios) es para distinguirlas de la asignación.

test $cad1 = $cad2

!= verdadero si son distintas.

-z verdadero si cadena es nula

-n verdadero si la cadena es no nula

- ficheros.

  • -a verdadero si el fichero existe (directorios o ficheros)
  • - f verdadero si el fichero existe y es un fichero ordinario.
  • - d verdadero si existe y es un directorio.
  • - h verdadero si es un enlace simbólico.
  • - r verdadero si tiene permisos de lectura
  • - x verdadero si tiene permisos de ejecución
  • - w verdadero si tiene permisos de escritura
  • - s verdadero si el fichero existe y no está vacío
  • and: -a
  • or: -o
  • not: !

7. Ejecución condicional

Lo primero que necesitamos es definir la variable $? que contendrá el código de salida del último comando ejecutado en el sistema. Tomará el valor 0 si el ultimo comando se ha ejecutado con éxito y <> 0 si no ha sido así. Esto nos servirá para comandos como el egrep que si se ha encontrado el patrón con éxito, pues devolverá un código de salida igual a 0.

* Operador grave: Se utiliza para realizar la ejecución de un comando y poder trabajar o bien con su código de salida o con su salida.

7.1. Bucle if

if

then
      …
      …
   #parte opcional
else
      …
      …
#fin de la parte opcional
fi

7.2. Bucles for

   for variable in conjunto_de_valores
   do
      …
      …
      …
   done

7.3. Bucles while

   while condicion
   do
      …
      …
   done

7.4. Bucles until

   until condicion
   do
      …
      …
   done

7.5. Sentencia case

   case $variable in
   
   valor1)      …
         …
         …;;
   valor2)      …
         …
         …;;
   …
   …
   #opcional el otherwise
   *)      …
         …
         …;
   esac

7.6. Break, continue y exit

Dentro de los bucles while y until se pueden usar:
   Break: termina la ejecución del bucle.
   Continue: Vuelve a la sentencia inmediatamente anterior al bucle.

   Break x: Termina la ejecución de x bucles anidados.

   Exit nos permite la terminación del script.

   Exit x permite especificar el código de salida del script.

8. Funciones y procedimientos

Las funciones en unix han de ser declaradas al principio del script:

   function nombre()
   {
      …
      …
      $1 ? primer parámetro que le hemos pasado
      …
      …
   }

   #resto del script.

   Una función devolverá un valor, siempre que haga una única “salida por pantalla” que será la almacenada en la variable a la que está asignada la llamada de la función.

   Ejemplo:
   function cuadrado()
   {
      cuad=`expr $1 \* $2`
      echo $cuad
   }
   
   read num
   a=`cuadrado $num`
   echo el cuadrado de $num es $a

   Desde dentro de una función accedemos a los argumentos pasados al igual que desde dentro de un script, es decir con $1 $2 $3, …

   Podemos escribir todas las funciones en un archivo de texto y luego cargarlas para que el sistema las tenga en memoria.

   Para cargarlas en memoria:    . nombre_fichero

9. Operadores && y ||

9.1. &&

Sintaxis: comando1 && comando2

El comando 2 se ejecuta sí y solo si el comando 1 se ha ejecutado con éxito.

9.2. ||

Sintaxis: comando1 || comando2

El comando 2 se ejecuta sí y solo si el comando1 no se ha ejecutado con éxito.

Ejemplo: (mv $1 $2 && echo éxito!!) || echo error

Capítulo III. Sistema de arranque y parada del Sistema Operativo en Unix

1. Arranque

Cuando el sistema inicia su funcionamiento crea el proceso INIT que será el padre de todos los procesos. Su PID será el 1. A partir del estado INIT, el sistema ejecutará una serie de procesos. La información sobre los ficheros y procesos que tiene que ejecutar durante el arranque estará en /etc/inittab.

2. Estado INIT: o nivel de ejecución

Es una configuración software del sistema que indica que procesos pueden existir durante y después del arranque del sistema operativo. El número de servicios disponibles en el sistema dependerá del estado en el que se encuentre el mismo. En un instante determinado un sistema solo puede encontrarse en uno de los estados INIT.

Hay dos grupos:

  • Monousuario: El sistema sólo es accesible desde la consola y únicamente puede acceder al mismo el súper usuario.
  • Multiusuario. El sistema puede ser accedido desde cualquier terminal o desde la red y cualquier usuario puede acceder al mismo.

Estados:

  • Estado 0: Significa desconexión o estado de apagado. Equivale a apagar la máquina de forma ordenada.
  • Estado 1 o estado de administración. Sólo root puede acceder al sistema. Se puede acceder a todo el sistema de ficheros multiusuario. Es usado para administración y mantenimiento.
  • Estado S: Estado monousuario. Sólo root puede acceder pero solo se puede acceder al sistema de ficheros raiz.
  • Estado 2: Estado multiusuario sin NFS( network file sistem ). Cualquier usuario puede acceder al sistema pero no a través de la red.
  • Estado 3: Estado multiusuario con NFS.
  • Estado 5: Modo X11. La consola del sistema arranca con las X (modo gráfico).
  • Estado 6: Parada y reinicio del sistema. Se para la máquina y se inicia de nuevo.


   Para pasar de un estado a otro escribimos:
      init

3. /etc/inittab

identificador:runlevel:action:process o script
Identificador: Secuencia de 2 o más caracteres que identifica la linea. Para líneas que contienen procesos getty contendrá el numero del terminal donde se ejecutará el proceso.
Runlevel: Nivel de ejecución. Especifica el estado INIT en el que deben ejecutarse los procesos indicados.
Action: Especifica como tratar el proceso, es decir, cuando y como se ejecuta el proceso correspondiente. Acciones:

   - INIT default: Especifica el nivel de ejecución por defecto.
   - respawn: el proceso una vez que finalice va a ser ejecutado de nuevo.
- wait: indica al proceso INIT que espere hasta su terminación antes de continuar con la siguiente entrada.
- once: el proceso se ejecuta una sola vez.
- boot: se ejecuta durante el arranque del sistema operativo, ignorándose el nivel de ejecución.
- sysinit: Durante el arranque del SO pero antes que cualquier otro proceso y además el sistema espera hasta su finalización.
- ctrlaltdel: se ejecuta cuando se pulsa esa combinación.
- powerwait: cuando hay un fallo de corriente.
Process o script: Suelen ser scripts que se encargan de arrancar o de parar una serie de servicios.

/etc/inittab

Capítulo 4. Usuarios y grupos. Procesos

1. Usuarios y grupos

Una cuenta de usuario nos permitirá acceder a un sistema unix.

Un sistema engloba los usuarios en grupos, con una serie de permisos similares para todos ellos, en lugar de establecer los permisos individualmente.

1.1 Usuarios

/etc/passwd
   login:contraseña:uid:gid:inf_user:dir_home:shell

   La contraseña encriptada se encuentra en el fichero:
   /etc/shadow
   login:contraseña:::::::

   Para crear un usuario hay que hacer lo siguiente:
   - Incluir una linea con sus datos en los fichero anteriormente descritos.
   - Crear su directorio home y darle permisos y propiedad.
   - Copiar los ficheros de esqueleto (/etc/skel/) en el directorio home del usuario.

   usermod: Comando que modifica la información del usuario.
      - u    uid
      - g   gid
      - h    dir_home

   finger: comando que proporciona información acerca de los usuarios conectados al sistema.

1.2. Grupos

   /etc/group
   nombre:contraseña:gid:user1,user2,…

   Cada usuario pertenece a un grupo por defecto y en la lista de usuarios del grupo al que pertenece por defecto, no aparecerá dicho usuario.

2. Comandos varios

2.1. Fichero /etc/fstab

Su nombre es File System Table o también tabla de sistema de ficheros. Contiene una entrada para cada sistema de ficheros o archivos que hay que montar durante el arranque del Sistema Operativo.

Puede haber un error en el arranque, con “mount –a” se puede volver a montar todo el sistema de ficheros.

La estructura que tiene es:

  • dispositivo_a_montar
  • punto_de_montaje
  • tipo_del_distema_de_ficheros
  • opciones_sobre_montaje

Con el comando mount –a montaría todos los sistemas de ficheros que hay en el fstab sin tener que arrancar la máquina.

2.1. Montaje de sistemas de ficheros

mount [opciones] <fichero_de_dispositivo> <punto_de_montaje>
   -t especifica el tipo de sistema de ficheros que queremos montar.
   VFAT      NTFS      ISO9660
   HPFS      NFS      SMBFS
   
   Ej: mount –t vfat /dev/fd0 /mnt/floppy

umount fichero_de_dispositivo punto_de_montaje

2.2. Comandos de sistemas de ficheros

mkfs [opciones] <fichero_de_dispositivo>
      -p?permite comprobar el formato del sistema de ficheros que queremos crear.

fsck: Permite comprobar, revisar y reparar un sistema de ficheros.

mknod: Permite crear un fichero de dispositivo.

mkdev: permite crear automáticamente todos los ficheros asociados a una familia de dispositivos. Un fichero de dispositivos apunta a una serie de rutinas que permiten manejarse con ese dispositivo.

df: Nos informa del espacio libre en un sistema de ficheros.

2.3. Enlaces

  • Duros: ln fichero_existente nuevo_fichero
  • Simbólicos:   ln –l fichero_existente nuevo_fichero

2.4. Modos de ejecución

a) Background (segundo plano):   
comando&
b) Ejecución continuada:
nohup ? Ejecuta un comando aunque cierre la sesión.
      La salida del comando se almacenará en nohup.out
c) Unión de ambos: Se puede conseguir ejecutar un proceso en segundo plano y que además continúe ejecutándose aunque se finalice la sesión en la maquina:
      nohup comando&

   jobs: Muestra los trabajos interrumpidos o que se están ejecutando en 2º plano.
   
   bg mando un trabajo interrumpido a background.
   fg mando un trabajo a primer plano

2.5. Ejecución programada de procesos

at: Permite planificar un trabajo para su ejecución en un instante de tiempo determinado.

crontab: permite planificar trabajos para su ejecución periódica. Usa un fichero que se llama crontab que tiene una serie de campos que especifican cuando se ejecutará el trabajo.

2.6. Prioridades de procesos

   nice: Ejecuta un proceso con una prioridad determinada.
   renice: Altera la prioridad de un proceso que ya está ejecutándose

2.7. Comando ps (información de proceso)

ps [opciones]
   
   Opciones:
   -l ? listado completo de todos los procesos.
      UID ? Número identificador del usuario.
      PID ? Número identificador del proceso.
      PPID ? Identificador del proceso padre.
      C ? Índice de utilización reciente del procesador.
      STIME ? Tiempo de inicio del proceso.
      TTY ? Id del terminal.
      TIME ? Tiempo de CPU consumido por el proceso.
      COMMAND ? Nombre del comando que ejecuta.
   
      S ? Estado del proceso.
         O: ejecución.
         S: durmiendo.
         Z: zombie.
         X: En espera de más memoria.
   -a ? Lista de todos los procesos en ejecución.

3. Copias de seguridad

3.1. tar

tar función [opciones] archivo.tar
   c: permite crear un fichero de salida que guarda un grupo de ficheros.
   x: opción inversa.
   t: listar el contenido de un fichero tar.
   r: permite reemplazar un fichero existente por una nueva versión.
   u: permite añadir un fichero que no existe al fichero tar.
      Opciones:
      -v: Va mostrando información.
      -z: permite comprimir o descomprimir.
      -f: para poder usar un fichero de salida

   Ejemplo: tar –cvf fichero.tar dir_backup
   El tar es recursivo por defecto. Hay que incluir la extensión .tar en el fichero destino.

3.2. Zip / unzip

   zip fichero.zip dir_backup ? comprimir.
   Le añade la extension .zip automáticamente.
   Ej: zip –r fichero_destino directorio

   unzip fichero.zip ? descomprimir.

4. Funciones del shell

Sustitución del history.

  • Alias: Determinar o sustituir alias.
    • alias dir=’ls –l’      (derecha del 0)
    • unalias dir (lo deshace)
  • Redirección
  • comando > fichero (antes de la ejecución del comando, el shell mira permisos, existencia del fichero, …)
  • Sustitución de variables y sustitución de comandos.
  • Expansión de ficheros (comodines, *?)
  • Ejecución del comando.

Deja tu opinión

  • Nombre (*)
  • Correo electrónico (*)

Comentario (*)

la política de privacidad que declaro haber leído.

(*) Campos necesarios. El correo electrónico no será público.

WebProgramacion Consultoría Informática · Teléfono de atención al cliente: +34 923 199 148 · C/ Los Verdes 7, Bajo B. 37185 Villamayor, Salamanca · atencion.cliente@webprogramacion.com