Documente online.
Username / Parola inexistente
  Zona de administrare documente. Fisierele tale  
Am uitat parola x Creaza cont nou
  Home Exploreaza



























Shell-Scripts en UNIX

Franceza











ALTE DOCUMENTE

11 septembre 2001
La Normandie
Pascal Obispo
ABC
DES SALAIRES DU TRAVAIL
Le sens de la vie
L entrainement
LE MOTEUR ET3
ARTICLE
L'automobile detruit la ville




Shell-Scripts en UNIX

 

Un shell-Script es un fichero de texto que automatiza tareas al estilo de ficheros batch para DOS. Pueden crearse en cualquier editor de texto o bien con el comando cat.

Su ejecución se realizará de la siguiente forma: sh nombre_script [argumentos], o bien, chmod ugo+x nombre_script, nombre_script.

  • 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:

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.

Bucles:

 

§         Estructura if

if condicion1

then

      comandos si la condicion1 se cumple

elif condicion2

then

      comandos si la condición2 se cumple

else

      comandos si las condiciones 1 y 2 no se cumplen

fi

§         Estructura for

for variable in [lista de valores]

do

      Comandos

done

§         Estructura While

while condicion

do

      comandos

done

§         Estructura Until

until condicion

do

      comandos

done

§         Estructura Case

case variable in

      patron1) comandos condicion1;;

      patron2) comandos condicion2;;

                  ...

      patron n) comandos condicion n;;

      *) comandos si no se cumplen ninguna;;

esac

Especificación de condiciones:

  • Ficheros

-f à true si fichero existe

-r à true si fichero existe y con derecho de lectura

-w à true si fichero existe y con derecho de escritura

-x à true si fichero existe y con derecho de ejecución

-s à true si fichero existe y no es vacío

-d à true si directorio existe

Ejemplo: if [ ! -f fichero ] à si el fichero no existe (importante respetar los espacios)

§         Cadenas

-n à true si longitud cadena distinta 0

-z à true si longitud cadena es 0

= à true si son iguales

!= à true si son distintas

Ejemplo: if [ -n cadena1 ] à Si la longitud de la cadena es distinta de 0

Ejemplo: if [ cadena1 = cadena2 ] à Si las cadenas cadena1 y cadena2 son iguales

§         Enteros

-eq à iguales

-ne à distintos

-gt à dato1 mayor que dato2

-ge à dato1 mayor o igual que dato2

-lt à dato1 menor que dato2

-le à dato1 mejor o igual que dato2

Ejemplo:   if [ valor -eq 20 ] à si el valor numérico es un determinado escalar

Ejemplo:   if [ valor1 -gt valor2 ] à si el valor1 es mayor que el valor2

  • Otros comandos de utilidad:

El comando exit se utiliza para salir de un Shell-Script de forma inmediata. Como opción, puede utilizar un número para indicar un estado de salida (la variable $? Contiene la condición de salida devuelta por un último comando).

            El comando break se utiliza para formar la salida de un bucle.

            break [n], donde n es el número de bucles de los que saldríamos en el caso de que hubiera varios anidados.

            El comando continue se utiliza para saltar iteraciones en un bucle.

            continue n, hace que se salten tantas iteraciones del bucle como especifique n.

            El comando Shift produce un desplazamiento no circular hacia la izquierda de los argumentos pasados al Shell-Script.

  • Expresiones numéricas:

            Las variables en el Shell son por defecto alfanuméricas. Para darles tratamiento numérico debemos recurrir al comando expr que evalúa expresiones aritméticas.

            Ejemplo: expr 3 + 4 à 7

            Utilizando comillas simples inversas podemos asignar comandos a variables.

            Ejemplo:

            Cd

            n = `pwd`

            echo $n à /localhome/usuario

            De esta forma aplicando la sustitución de un comando por su resultado, se puede dar tratamiento numérico al contenido de una variable.

            Ejemplo:

            a= 3

            a=  `expr $a +2`

            echo $a à 5

Redireccionamiento:

(Estándar por teclado ) Entrada à Procesos à Salida (estándar por pantalla)

Podemos redireccionar la entrada o salida a cualquier otro dispositivo.

Ejemplo: ls -l > fichero  à envía la salida a un fichero con la salida del comando ls.

> salida     < entrada

  • Comandos de tratamiento de texto y ficheros de texto

Cat à crea, visualiza y concatena un fichero de texto

cat > fichero à crea el fichero de texto. Para terminar con la entrada pulsar Ctrol+D

cat fichero à visualiza el fichero

cat fichero fichero > f2 à concatena el fichero "fichero" y lo guarda en el fichero f2.

El operador de redirección de salida es destructivo (>), si existiera f2 lo destruye sobrescribiendo la nueva información. Para no destruirlo se utilizaría el redireccionador (>>).

cat < f1 > f2 à coge la entrada de f1 y pone como salida f2, es decir, copia f1 en f2.

ls -R /> listado à listado recursivo del sistema de ficheros (como un dir /s en DOS) y lo guarda en el fichero listado.

more listado à edita ficheros largos, para bajar líneas pulsar Enter, para paginar, la barra espaciadora. Para salir pulsamos q  o anulamos el proceso con Control + C.

less listado à edita ficheros de texto pero se diferencia con more en que podemos utilizar todas las teclas de dirección.

Para comparar ficheros utilizaremos cmp f1 f2 à compara los dos ficheros, y nos dará como salida en el primer carácter que no son iguales los dos ficheros. También podemos comparar con el comando dic f1 f2 à nos mostrará las líneas diferentes en los dos ficheros.

Para comparar se suele utilizar el comando comm f1 f2 à muestra tres columnas, la primera serán las líneas únicas del fichero f1, la segunda las líneas únicas del fichero f2 y la tercera columna, las líneas comunes de los dos ficheros.

Para ordenar un fichero de texto se utiliza el comando sort fichero, sort -n lo mostrará en orden numérico y sort -r en orden inverso. Así por ejemplo sort fichero -n -r o sort fichero -nr ordena en forma inversa un fichero numérico.

wc fichero à muestra número de líneas, número de palabras y número de caracteres.

wc -l fichero à muestra nº de líneas

wc -c fichero à muestra nº de palabras

wc -w fichero à muestra nº de caracteres.

head y tail à muestra las primeras o las últimas n líneas de un fichero

head -5 fichero à muestra las 5 primeras líneas de fichero.

taid -3 fichero à muestra las 3 últimas líneas de fichero.


mkdir: crea directorio à mkdir uno

mkdir -p uno/dos/tres à crea el árbol de directorios raiz-usuario-uno-dos-tres.

ls -R uno à veremos el árbol de directorio de uno (igual que dir /s en DOS).

rmdir : borra un directorio. Para poder borrar un directorio debe estar vacío. Para hacer un borrado recursivo usamos rm -r uno (borra el árbol que anteriormente creamos con mkdir -p uno/dos/tres).

cp: copia ficheros à cp rutaorigen rutadestino à cp fich $HOME à copia al directorio de trabajo ($HOME) el fichero fich.

mv: mover ficheros (misma sintaxis que cp). Si utilizamos mv fich fich2 renombraremos el fichero fich.

rm: borra un fichero. rm -r borra un directorio y sus subdirectorios.

  • El editor de texto vi

(no es práctico utilizar msedit y cat)

Pipes o tuberías

Son mecanismos que permiten comunicar procesos entre sí, es decir, la salida estándar de un proceso será la entrada del otro. Se utiliza el carácter | para concatenar los procesos.

ls | more à visualiza el listado (ls) línea a línea.

ls | sort | more à igual que el anterior pero el listado sería ordenado.

cat nombres | sort > ordenado à visualiza el fichero nombres ordenado almacenándolo en el fichero "ordenado".

grep busca una cadena de caracteres en una serie de ficheros que especificamos como parámetros. Sus opciones serán:

      -c : cuenta las líneas en las que aparece la cadena.

      -l : muestra los nombres de los ficheros en los que aparece la cadena.

      -i : no diferencia entre mayúsculas y minúsculas.


·        à filtro de primer carácter.

Caracteres comodín para búsqueda con greg

 
^    à principio de línea.

$    à final de línea.

Ejemplo: mostrar el nombre de los ficheros en el directorio de trabajo en los que aparece alguna línea que comience por c.

grep -l ^c. $home/*

Donde ^c. Son las líneas que comienzan por c.Y $home/* es la ruta del directorio de trabajo ($home) y el * indica a todos los ficheros del directorio de trabajo.

Ejemplo: contar el número de líneas en un fichero que entra como parámetro y que termina por c.

grep -c .c$ fichero

Donde -c indica a greg que cuente el número de líneas y .c$ las líneas que terminan por c.

Find: busca a partir de un directorio que entra como parámetro, una serie de ficheros.


- name  " " : según el nombre y entre comillas un patrón de búsqueda.

Criterios de búsqueda de FIND        -size tamaño : busca ficheros con tamaño = a "tamaño" ej: -size +1024.

-user id usuario: busca ficheros según el usuario.

            Ejemplo: buscar a partir del directorio raiz, aquellos ficheros que comienzan por una letra minúscula, el resultado guardarlo en un fichero llamado nombres.

 

find / -name "[a-z]*" > nombres

Donde / especifica el directorio raiz. -name realiza una búsqueda por nombre con find de el intervalo [a-z] (letras minúsculas) donde "[a-z]*" especifica a los ficheros que comienzan por minúscula y le sigue cualquier cosa. El operador > nombres, redireccionará la salida al fichero nombres.

find /tmp -name "*.c" -size +1024

Busca en el directorio /tmp ficheros que el nombre y con tamaño mayor a 1024 bytes.

Especificaciones de los Shell-Script

            Son ficheros tipo batch (proceso por lotes en DOS) en los que cada línea que lo compone, es una orden que se puede implementar en el prompt del sistema operativo. Los shell-script además pueden contener estructuras y declaraciones.

            Para ejecutarlos hay que darle todos los derechos al fichero con el comando chmod 777 nombrefichero. Para incluir un fichero en el PATH pondremos PATH = $PATH:$HOME à añade al path el directorio home.

            El comando read variable, lee desde teclado un valor y lo almacena en variable. Si ponemos read numero y tecleamos 12, almacenará el valor 12 en número. Lo podemos comprobar si después tenemos la orden echo $numero.

            Un ejemplo sencillo sería, un shell-script llamado ejemplo1 que admita un número indeterminado de parámetros y que muestre, el nombre del shell-script (es decir el nombre del fichero ejemplo1 $0), el número de parámetros que le hemos pasado y el nombre de esos parámetros:

echo nombre shell-script: $0

echo número de parámetros: $#

echo nombre de parámetros : $*

            expr evalúa aritméticamente las variables que le siguen expr 3 + 4 dará como salida 7.

Ejemplos prácticos de programación de scripts:

  • Realizar un shell-script que lea dos números de teclado y muestre un mensaje indicando cual de ellos es mayor o bien si son iguales.

echo Introduce numero1

read n1

echo Introduce numero2

read n2

if [ $n1 -gt $n2 ]

then

            echo El numero $1 es mayor que $n2

elif [ $n2 -gt $n1 ]

then

            echo El número $n2 es mayor que $n1

else

            echo Los números $n1 y $n2 son iguales

fi

  • Realizar un shell-script que admita un único parámetro correspondiente a un fichero del directorio actual, si existe debe contar el número de líneas del mismo y mostrar un msg indicando dicho número, si no existe debe mostrar un msg de error y salir.

if [ $# -ne 1 ]

then

            echo Sintaxis $0 fichero

            echo Demasiados parámetros

else

            if [ ! -f $1]

            then

                        echo El fichero no existe

                        exit

            else

                        wc -l $1 > ficheraux 

read numlinea nombre < ficheraux

           echo el número de líneas es $numlinea 

fi

fi

  • 1ª parte: Realizar un programa que dado un directorio inicial y el nombre de un fichero, el programa debe buscar el fichero en cualquier subdirectorio que cuelgue del inicial. Los parámetros serán:

1.      Directorio inicial, especificando mediante su ruta completa.

2.      Nombre del fichero a buscar.

Si se encuentra mostrar el fichero y su ruta.

2ª parte: Si el programa encuentra el fichero se mostrará además de la ruta de la siguiente información máscara de permisos, tamaño en bytes y fecha de la última modificación realizada sobre el fichero en formato mm/dd/hora

if [ $# -ne 2 ]

then

            echo error hay demasiados parámetros

elif [ ! -d $1 ]

then

            echo el directorio no existe

            exit

fi

fi

lista = `ls $1`

for i in lista

do

            if [ -f $i ]

            then

                        if [ $2 = $i ]

                        then

                                   echo $1 / $i

                        fi

            fi

            if [ -d $i ]

            then

                        ejercicio $1 / $i $2 à llamada recursiva al programa

            fi

done

  • Realizar un Shell-Script que admita como único parámetro el nombre de un directorio, especificado mediante su nombre de ruta completo, si el directorio  existe el programa debe mostrar el nombre de todos sus entradas, indicando para cada una de ellas si se trata de un fichero o un directorio. Si el directorio no existe se mostrará un mensaje de error.

if [ $# -ne 1]

then

            echo error, más de un parámetro

else

if [ ! -d $1 ]

then

            echo el fichero no existe

            exit

$1 es el directorio parámetro, p.e. /tmp y si queremos ver lo que cuelga de él la sintaxis será /tmp/* . También podemos generar lo que cuelga de $1 usando el comando ls, poniendo `ls $1`

 
else

for i in $1/*      à

            do

                        if [ -f $i ]

                        then

                                   echo $i : fichero

                        fi

            done

fi

fi

  • Realizar un shell-script que reciba como parámetro un número indeterminado de nombre de ficheros y como último parámetro un directorio especificado mediante su  nombre de ruta completo. El programa debe mostrar un mensaje indicando cuantos de los ficheros especificados permanecen en dicho directorio.

for i in $*

do

            directorio=$i

done

if [ ! -d $directorio ]

then

            echo error, el directorio no existe

            exit

else

for i in $*

do

if [ ! -d $i ]

            if [ -f $directorio /$i ]

            then

                        count = $ ( cont + 1 )

            fi

fi

done

  • Pseudo código del algoritmo Round-Robin con enfoque a Shell-Script

T1 = $1

T2 = $2

Tactual = 0

While ...

                        If (t1-quantum) >= 0

                                   T1 = t1 - quantum

                                   Tactual= Tactual + quantum

                                   If (T1=0) then finproceso1 = Tactual

                        Else     Tactual=Tactual + t1

                                   T1=0

                                   Finproceso1=Tactual

  • Shell-Script del algoritmo SJF expulsor

Implementar una simulación del algoritmo SJF expulsor para dos procesos. El Shell-Script se encarga de solicitar al usuario los tiempos de llegada y servicio de los dos procesos

                  T.Llegada        T.Servicio

P1                    0                     4

P2                    1                      2

            Pseudocódigo

Leer tl1, ts1, tl2, ts2

Ciclo=0

P1=0

P2=0

Mientras (ts1 > 0) or (ts2 > 0) hacer

              If (tl1=ciclo) entonces P1=0 fi //si ts1 es igual a uno, el proceso está dentro.

              If (tl2=ciclo) entonces P2=0 fi

              If (ts1=0) and (p1=0) entonces P1=0 fi

If (ts2=0) and (p2=0) entonces P2=0 fi

              If (p1=1) and (p2=1) entonces

                          If (ts1 <= ts2) entonces

                                      Ts1=ts1-1 //p1; mostrar informacion está ejacutándose

                          else ts2=ts2-1; mostrar información

              else If (p1=1) entonces ts1=ts1 -1

                    else ts2=ts2 -1

                     fi

              fi

ciclo=ciclo + 1

finmientras

Implementacion shell-script

echo Introduce el tiempo de llegada de los procesos 1 y 2

read tl1

read tl2

echo Introduce el tiempo de servicio de los procesos 1 y 2

read ts1

read ts2

if [ $# -ne 4 ]

then

  echo El número de parámetros es incorrecto

  exit

fi

ciclo = 0

p1=0

p2=0

while [ $ts1 -gt 0 ] || [$ts2 -gt 0 ]

do

              if [ $tl1 -eq ciclo ]

P1 es booleano, si está a 1 el proceso 1 está ejecutándose en el procesador, si es cero no se está ejecutando.

 
              then

$p1 = 1  à

                        fi

              if [ $tl2 -eq ciclo ]

              then

$p2 = 1

                        fi

                        if [$ts1 -eq 0 ] && [ $p1 -eq 1 ]

                        then

                                   $p1=0

                        fi

                        if [$ts2 -eq 0 ] && [ $p2 -eq 1 ]

                        then

                                   $p2=0

                        fi

                        if [ $p1 -eq 1 ] || [ $p2 -eq 1 ]

                        then

                                   if [ $p1 - eq 1 ] && [ $p2 -eq 1 ]

                                   then

                                               if [ $ts1 -lt $ts2 ]

then

            ts1 = $ (( ts1 - 1 ))

else

            ts2 = $ (( ts2 - 1 ))

fi

                                   else      if [ $p1 -eq 1 ]

                                               then

Decrementamos el ts del proceso 1 y imprimimos la salida del ciclo en proceso ej: P1: 1 - 2 donde 1 es ciclo en proceso y 2 es ciclopos (ciclo posterior)

 
                                                           ts1 = $ (( ts1 -1 ))

                                                           ciclopos = $ (( ciclo +1 ))  à

                                                           echo p1: $ciclo - $ciclopos

                                               else

                                                            ts2 = $ (( ts2 -1 ))

                                                           ciclopos = $ (( ciclo +1 ))

                                                           echo p2: $ciclo - $ciclopos

                                               fi

                                   fi

                        fi

            ciclo = $ (( ciclo + 1 ))

done

§         Problema

Escribir un shell-script que construya un menú con 4 opciones. El menú

opera sobre un fichero llamado datos. Cada línea del fichero contiene dos cadenas: un nombre y un numero de teléfono. El fichero esta ordenado

alfabéticamente por el nombre. Las opciones del menú son:

      1. Búsqueda de un teléfono, dado el nombre

      2. Alta, dado el nombre

      3. Baja, dado el nombre

      4. Listado por pantalla del fichero completo

# Conviene crear el fichero vacio si no existe

if [ ! -f datos ]

then

  echo > datos

fi

while true

do

  clear

  echo AGENDA TELEFONICA

  echo

  echo   1. Buscar entrada

  echo   2. Insertar entrada

  echo   3. Borrar entrada

  echo   4. Mostrar listado

  echo   5. Salir

  echo

  echo -n Opcion elegida: 

  read opcion

  case $opcion in

    1) clear

       echo BUSCAR ENTRADA

       echo

       echo -n Introduzca el nombre del usuario: 

       read nombre

       if [ -z $nombre ]

       then

          break

       fi

       echo

       grep -i $nombre datos

       if [ $? -ne 0 ]

       then

         echo La entrada no existe

         echo 

       fi

       echo

       echo Pulse INTRO para continuar...

       read intro;;

    2) clear

       echo INSERTAR ENTRADA

       echo

       echo -n Introduzca el nombre del usuario: 

       read nombre

       if [ -z $nombre ]

       then

          break

       fi

       echo

       echo -n Introduzca el telefono: 

       read telefono

       if [ -z $telefono ]

       then

          break

       fi

       echo

       echo "$nombre $telefono" >> datos

       sort -d datos > temp

       mv temp datos;;

    3) clear

       echo BORRAR ENTRADA

       echo

       echo -n Introduzca el nombre del usuario: 

       read nombre

       if [ -z $nombre ]

       then

          break

       fi

       echo

       # Opcion 1

       grep -v $nombre datos > temp

       mv temp datos;;

       # Opcion 2

       # grep -d "^[\<$nombre\>]" datos > temp

       # mv temp datos;;

        

    4) clear

       echo LISTAR ENTRADAS

       echo

       more datos

       echo

       echo Pulse INTRO para continuar...

       read intro;;

    5) clear

       exit 0;;

  esac

done

    

   

§         Problema 2

Escribir un Shell-Script que tome como parámetro el nombre de un directorio y realice las siguientes acciones:

      1. Comprobar que el numero de parametros es correcto

      2. Comprobar que el parametro es un directorio

3. Para cada entrada del directorio especificado el programa genera:

      El numero de la entrada

            Nombre de la entrada

            Tipo de la entrada: fichero, directorio, ...

            Tamaño

            Numero de enlaces

            Día y Mes de la última modificación

# Comprobamos el numero de parametros

if [ $# -ne 1 ]

then

   echo Numero de parametros incorrecto

   echo

   echo Sintaxis: $0 directorio

   echo

   exit 0

fi

# Comprobamos que el parametro es un directorio

  

if [ ! -d $1 ]

then

   echo El parametro especificado no es un directorio

   echo

   echo Sintaxis: $0 directorio

   echo

   exit 0

fi

# Listado de los ficheros del directorio

cont=0

for i in $1/*

do

  echo Entrada numero: $cont

  ls -l $i

  cont=`expr $cont + 1`           

done

§         Problema 3

Realizar un shell-script en el que:

1. Si el primer parámetro es -l o -L, cree un enlace del fichero o directorio especificado en el segundo parámetro con el nombre especificado en el tercer parámetro.

2. Si el primer parámetro es -c o -C, contara y mostrara el numero de líneas, palabras y caracteres de todos los ficheros que se pasen por parámetro.

3. Si el primer parámetro es un nombre de fichero existente en el directorio actual, cambiar al directorio a cual nos vamos al hacer cd sin parámetros, crear en este un subdirectorio cuyo nombre se leerá por teclado, cambiar a este subdirectorio y copiar el fichero dado como primer parámetro con el nombre especificado en el segundo parámetro.

# CASO 1

if [ $1 = "l" -o $1 = "L" ]

then

  if [ $# -ne 3 ]

  then

    echo Sintaxis $0 -l|L fichero/directorio nombre

    echo

    exit

  else

    if [ -f $2 ]

    then

      ln $2 $3

    else

      ln -s $2 $3

    fi

    echo Enlace realizado con exito

    exit

  fi

fi

# CASO 2

if [ $1 = "c" -o $1 = "C" ]

then

  if [ $# -lt 2 ]

  then

    echo Sintaxis $0 -c|C lista_ficheros

    echo

    exit

  else

    for i in $*

    do

      if [ -f $i ]

      then

        wc $i > temp

        read lineas palabras caracteres x < temp

        echo $i: $lineas lineas, $palabras palabras, $caracteres caracteres

        rm temp

      else

        echo Atencion: $i no es un fichero

      fi

    done

    exit

  fi

fi

     

# CASO 3

if [ $# -lt 2 ]

then

  echo Sintaxis $0 fichero1 fichero2

  echo

  exit

else

  if [ -f $1 ]

  then

    actual=$PWD

    cd $HOME

    # Comprobacion del directorio

    while true

    do

      echo -n Introduzca el nombre del directorio:

      read directorio

      if [ -z $directorio ]

      then

        continue

      else

        break

      fi

    done

   

    # Si no existe el directorio lo creamos

    if [ -d $directorio ]

    then

      echo El directorio ya existe

    else

      mkdir $directorio    

    fi 

    cd $directorio

    cp $actual/$1 $2

    echo Copia realizada con exito

  else

    echo El fichero especificado no existe

    echo

    exit

  fi

fi 

 

§         El usuario debe introducir 5 palabras separadas por espacios que serán ordenadas alfabéticamente en orden inverso y mostrará en pantalla únicamente la primera palabra resultado de la ordenación.

clear

echo "Introduzca 5 elementos (separados por espacios):"

read uno dos tres cuatro cinco

echo $uno > temp

echo $dos >> temp

echo $tres >> temp

echo $cuatro >> temp

echo $cinco >> temp

sort -r temp > temp2

resultado=`head -1 temp2`

rm temp

rm temp2

echo El resultado es $resultado

§         Comprobar si el numero de ficheros existentes en el directorio actual es mayor que el número de usuarios conectados al sistema

El shell-script debe responder:

      usuarios: si el numero de usuario es mayor

      ficheros: si el numero de ficheros es mayor

clear

who > usuarios

wc -l usuarios > temp1

ls -l > ficheros

wc -l ficheros >> temp1

sort -r temp1  > temp2

head -1 temp2 > temp1

read x resultado < temp1

rm temp1

rm temp2

rm usuarios

rm ficheros

echo Contiene mayor numero de lineas: $resultado

§         Debe crear dos directorio D1 y D2. Dentro de D2 debe crear un fichero 'hola' que contenga el nombre del usuario conectado. Después debemos movernos al directorio D1 y desde allí crear un enlace simbólico al fichero hola especificando su ruta completa.

mkdir D1

mkdir D2

cd D2

logname > hola

ruta=`pwd`

cd ../D1

ln -s $ruta/hola

§         Realizar un shell-script que acepte como parámetros:

1. Una serie de nombres de archivo.

2. Como ultimo parámetro, el nombre de un archivo que no debe existir

Se mostrara en pantalla los nombres de los archivos parámetro, todos excepto el último.

En el fichero dado como último parámetro se escribirán los nombres de los ficheros parámetro que tengan un numero de bytes superior a 30.

# CASO 1

if [ $1 = "l" -o $1 = "L" ]

then

  if [ $# -ne 3 ]

  then

    echo Sintaxis $0 -l|L fichero/directorio nombre

    echo

    exit

  else

    if [ -f $2 ]

    then

      ln $2 $3

    else

      ln -s $2 $3

    fi

    echo Enlace realizado con exito

    exit

  fi

fi

# CASO 2

if [ $1 = "c" -o $1 = "C" ]

then

  if [ $# -lt 2 ]

  then

    echo Sintaxis $0 -c|C lista_ficheros

    echo

    exit

  else

    for i in $*

    do

      if [ -f $i ]

      then

        wc $i > temp

        read lineas palabras caracteres x < temp

        echo $i: $lineas lineas, $palabras palabras, $caracteres caracteres

        rm temp

      else

        echo Atencion: $i no es un fichero

      fi

    done

    exit

  fi

fi

     

# CASO 3

if [ $# -lt 2 ]

then

  echo Sintaxis $0 fichero1 fichero2

  echo

  exit

else

  if [ -f $1 ]

  then

    actual=$PWD

    cd $HOME

    # Comprobacion del directorio

    while true

    do

      echo -n Introduzca el nombre del directorio:

      read directorio

      if [ -z $directorio ]

      then

        continue

      else

        break

      fi

    done

   

    # Si no existe el directorio lo creamos

    if [ -d $directorio ]

    then

      echo El directorio ya existe

    else

      mkdir $directorio    

    fi 

    cd $directorio

    cp $actual/$1 $2

    echo Copia realizada con exito

  else

    echo El fichero especificado no existe

    echo

    exit

  fi

fi 

 

§         Problema Shell-Script

 Realizar un shell-script que acepte como parámetros:

 1. Una serie de nombres de archivo.

 2. Como ultimo parámetro, el nombre de un archivo que no debe existir

 Se mostrara en pantalla los nombres de los archivos parámetro, todos

 excepto el ultimo.

 En el fichero dado como ultimo parámetro se escribirán los nombres de

 los ficheros parámetro que tengan un numero de bytes superior a 30.

# Comprobación del número de parámetros

if [ $# -lt 2 ]

then

   echo Sintaxis: $0 fichero1 fichero2 ... ficheroN

   echo

   exit

fi

# Comprobar que el ultimo fichero no existe

for i in $*

do

  fichero=$i

done

 

if [ -f $fichero ]

then

  echo Error: El ultimo fichero ya existe

  echo

  exit

fi

# Proceso de los ficheros introducidos por parametro

contador=1

for i in $*

do

  if [ $i = $fichero ]

  then

    break

  fi

  if [ -f $i ]

  then

    echo $i

    wc -c $i>temp

    read tamano x <temp

    if [ $tamano -gt 30 ]

    then

      echo $i>>$fichero

    fi   

  else

    echo El fichero $i no existe

    echo

    exit

  fi

done

if [ -f temp ]

then

  rm temp

§         Problema Shell-Script

En un sistema de información disponemos de un fichero de texto de la   forma:

      Primer_Apellido Segundo_Apellido Nombre

La prueba consistirÁ en escribir un shell-script que tenga tres parámetros:

      1. Directorio en el que se encuentra el fichero (D)

      2. Nombre del fichero (F)

      3. Numero de líneas (N)

 El shell-script debe realizar las siguientes acciones:

1. Comprobar la existencia del directorio (D).

2. Comprobar la existencia y derechos de lectura sobre el fichero  (F)dentro del directorio indicado

3. Localizar el fichero (F) todas las lineas correspondientes a sujetos cuyo primer apellido sea Felipe

4. Crear un fichero (f1) ordenado alfabeticamente segun el segundo       apellido, que contenga los N primeros nombres localizados

# Comprobacion del numero de parametros

if [ $# -ne 3 ]

then

   echo Sintaxis: $0 directorio fichero numero_lineas

   echo

   exit

fi

# Comprobar que el directorio existe

if [ ! -d $1 ]

then

   echo Error: El directorio no existe

   echo

   exit

fi

# Comprobar que el fichero existe

if [ ! -f $1/$2 ]

then

   echo Error: El fichero no existe

   echo

   exit

fi

# Comprobar que el derecho de lectura del fichero

if [ ! -r $1/$2 ]

then

   echo Error: El fichero debe tener permiso de lectura

   echo

   exit

fi

grep "^Felipe" $1/$2 > $1/temp

if [ $? -ne 0 ]

then

   echo No se encontro el patron

   rm $1/temp

   exit

else

   echo "Las entradas con el primer apellido \"Felipe\" son:"

   cat $1/temp

   echo

fi

sort +1 -2 $1/temp > $1/f1

echo "Los $3 primeros nombres del fichero ya ordenado son: "

head -$3 $1/f1

rm $1/temp

§         Problema Shell-Script

Realizar un shell-script que acepte como parámetros:

 1. La extension de un nombre de archivo.

 2. Ruta absoluta de un directorio

 Se mostrara en pantalla los nombres de los archivos parametro, todos

 excepto el ultimo.

 En el fichero dado como ultimo parametro se escribiran los nombres de

 los ficheros parametro que tengan un numero de bytes superior a 30.

for i in $1/*.$2

do

  echo $i

done

 

§         Realizar un shell-script que reciba como parámetro una extensión de archivo sin punto y el nombre de un directorio especificado mediante su nombre de ruta completo. El shell-script preguntará al usuario si desea copiar o mover los archivos del directorio actual que tengan esa extensión al directorio especificado como segundo parámetro. Una vez realizada la acción escogida se mostrará por pantalla un listado de los ficheros afectados, ordenados alfabéticamente.

if [ $# -ne 2 ]

then

            echo error, número de parámetros incorrecto

exit

fi

if [ ! -d $2 ]

then

            error directorio no existe

            exit

fi

echo Elija una opción:

echo 1. Para copiar

echo 2. Para mover

read opcion

while [ $opcion -ne 1 ] || [ $opcion -ne 2 ]

do

            echo error, opción incorrecta

echo vuelva a teclear opcion

done

if [ $opcion -eq 1 ]

then

            cp *.$1 $2  //copia todos los archivos con extensión $1 a el directorio $2

fi

if [ $opcion -eq 2 ]

then

            mv *.$1 $2  //copia todos los archivos con extensión $1 a el directorio $2

fi

....otro caso podríamos haberlo implementado con la estructura case:

.

.

.

case $opcion in

      1) cp *.$1 $2  //copia todos los archivos con extensión $1 a el directorio $2

      2) mv *.$1 $2  //copia todos los archivos con extensión $1 a el directorio $2

esac

Ejemplo de examen Shell-Script

Revisar el código del shell-script, corregir los problemas de sintaxis y lograr su funcionamiento.

§         Algoritmo FIFO

El shell-script recibe un fichero de texto que almacena una línea para cada proceso a planificar, cada línea tiene 3 campos separados  por un espacio en los que se almacena respectivamente el tiempo de llegada, el tiempo de servicio y un identificador de proceso.

Por ejemplo, el fichero podría ser:


0 5 P1                          P1: 0 - 5

2 3 P2                          P2: 5 - 11

1 6 P3                          P3: 11 - 14

4 2 P4                          P4: 14 - 16

el shell-script que deberíamos revisar sería:

1. read fichero

2. if [ NOT -f fichero ] then

3.    echo El primer parámetro debe ser un fichero de texto

4.    exit

5. else

6.    wc -l fichero > lineas

7.    sort -n fichero > copia

8.    read tinicial tllegada id < copia

9.    proceso = 1

10.   while ($proceso -le $lineas) do

11.         read llegada servicio id < copia

12.         echo $id : $(( tinicial-tservicio )) - $tinicial

13.         tinicial = $((tinicial+servicio))

14.         tail - ($lineas-$proceso) copia > aux

15.         mv aux copia

16.         proceso=proceso+1

17.   done

18.   rm copia

19. fi

corrección

if [ $# -ne 1 ]

then

echo sintaxis correcta: nombre_shell_script fichero 

      exit

else

if [ ! -f $1 ]

#comprobación de la existencia del fichero introducido como parámetro

      then

            wc -l fichero > temp.

            read lineas nombre < temp.

      rm temp.                è

            sort -n $1 > copia

      read tinicial tllegada id < copia

            proceso = 1

while [proceso -le $lineas]

do

read llegada servicio id < copia

            echo $id : $tinicial - $((tinicial + tservicio))

            tinicial = $((tinicial+servicio))

            tail -$((lineas - proceso) copia > aux

            mv aux copia

proceso = $((proceso + 1))

      done

rm copia

fi

fi


Document Info


Accesari: 11648
Apreciat:

Comenteaza documentul:

Nu esti inregistrat
Trebuie sa fii utilizator inregistrat pentru a putea comenta


Creaza cont nou

A fost util?

Daca documentul a fost util si crezi ca merita
sa adaugi un link catre el la tine in site

Copiaza codul
in pagina web a site-ului tau.

 


Copyright © Contact (SCRIGROUP Int. 2014 )