Publicado el 20 de Octubre del 2020
883 visualizaciones desde el 20 de Octubre del 2020
153,8 KB
9 paginas
Creado hace 17a (04/10/2007)
Laboratorio de Sistemas Operativos
Ingenierías Técnicas en Informática de Sistemas y Gestión
2006/2007
__________________________________________________________________________________________
Ejemplos de guiones shell
- Ruta absoluta vs. ruta relativa
Es muy importante saber en qué directorio estamos ubicados para poder referenciar
correctamente un archivo/directorio determinado.
El comando pwd nos muestra la ruta completa del directorio donde estamos trabajando.
La variable de entorno HOME (se accede a ella con $HOME) nos proporciona el directorio de
trabajo asociado al usuario.
Supongamos que nos encontramos en el directorio /home/usuario/Practica1. Después de
ejecutar el comando ls -l obtenemos la siguiente salida. Aquí hay dos subdirectorios
denominados Practica2 y public_html.
-rwxr-xr-x 1 jcarlos users 52 2007-03-09 20:32 ejemplo1
drwxr-xr-x 4 jcarlos users 728 2007-03-26 19:08 Practica2
-rwxr-xr-x 1 jcarlos users 56 2007-03-09 20:32 progreso
-rwxr-xr-x 1 jcarlos users 106 2007-03-01 22:52 prueba1
drwxr-xr-x 2 jcarlos users 80 2007-02-24 16:30 public_html
-rw-r--r-- 1 jcarlos users 1362 2007-03-05 20:54 rr
-rw-r--r-- 1 jcarlos users 7 2007-03-10 20:16 rr2
-rw-r--r-- 2 jcarlos users 21284 2007-03-10 20:15 rr2link
lrwxrwxrwx 1 jcarlos users 3 2007-03-10 20:14 rr2slink -> rr2
-rw-r--r-- 2 jcarlos users 21284 2007-03-10 20:15 rrlink
-rw-r--r-- 1 jcarlos users 0 2007-03-05 22:53 sal
Pues bien, cualquier referencia a este subdirectorio utilizando la ruta relativa será simplemente
a través de su nombre ya que se encuentra justo debajo de donde estamos.
ls -l Practica2
cd Practica2
Si nos encontráramos en el subdirectorio public_html, entonces
ls -l ../Practica2
cd ../Practica2
Todo éstos son ejemplos de ruta relativa.
Su ruta absoluta será /home/usuario/Practica1/Practica2. Ahora:
ls -l /home/usuario/Practica1/Practica2
cd /home/usuario/Practica1/Practica2
Ejemplos Shell Script
1
Laboratorio de Sistemas Operativos
Ingenierías Técnicas en Informática de Sistemas y Gestión
2006/2007
__________________________________________________________________________________________
Con estos comandos siempre obtendremos los mismos resultados, independientemente del
directorio desde donde los lancemos.
Si esto lo aplicamos a un shell script tendremos lo siguiente:
if [ -d Practica2 ] será cierto si Practica2 es un subdirectorio del directorio donde
ejecutemos el shell script.
[
-d
if
si
/home/usuario/Practica1/Practica2 es un directorio. Aquí no importa desde dónde
lanzamos el script ya que estamos utilizando la runta absoluta.
/home/usuario/Practica1/Practica2
cierto
será
]
echo $1 es un directorio
echo $1 no es un directorio
#!/bin/bash
if [ -d $1 ]
then
else
fi
Si estamos en el directorio /home/usuario/Practica1 y lanzamos el script ejemplo1 cuyo
código es el siguiente:
Aquí $1 representa el valor del primer argumento introducido al ejecutar lo siguiente:
Dentro del script anterior $1 será sustituido por el valor Practica2. Como Practica2 sí que es un
subdirectorio del directorio donde hemos lanzado el script, la salida será cierta.
Pero una ejecución como . ejemplo1 /home/usuario/Practica1/Practica2 también será cierta,
ya que ahora $1 será sustituido por el valor /home/usuario/Practica1/Practica2 que,
evidentemente, es un directorio.
. ejemplo1 Practica2
Supongamos ahora que el directorio de trabajo por defecto del usuario (directorio al que se
conecta el usuario) es /home/usuario. $HOME tendrá pues, el valor /home/usuario. Entonces:
if [ -d $HOME/Practica1 ] será cierta.
[
-d $HOME/Practica2
if
/home/usuario/Practica2
]
será
falsa pues no existe el directorio
Ejemplos Shell Script
2
Laboratorio de Sistemas Operativos
Ingenierías Técnicas en Informática de Sistemas y Gestión
2006/2007
__________________________________________________________________________________________
if [ -d $HOME/Practica1/Practica2 ] será cierta.
- Bucle for
En shell script esta instrucción de control es bastante elaborada. Su sintaxis general es:
for variable in lista
do
done
órdenes
...
Aquí lista puede ser algo tan variado como un conjunto de cadenas de caracteres, el conjunto
de archivos de directorio o la salida de un comando.
Ejemplos:
for i in 1 Ana Juan 58
El bucle se repetirá 4 veces. La variable i (acceso con $i) tomará en cada iteración,
respectivamente, los valores 1, Ana, Juan y 58.
for i in *
Aquí * representa todos los archivos del directorio donde ejecutemos el script. Probar si
no, a ejecutar desde el prompt el comando ls *.
Por tanto la variable i (acceso con $i) irá tomando sucesivamente como valor el nombre
de cada archivo del directorio.
for i in Practica2/*
Hará lo mismo que el ejemplo anterior, pero ahora con los archivos del subdirectorio
Practica2 (recuérdese la ruta relativa). Este ejemplo solamente funcionará si lanzamos
el script desde /home/usuario/Practica1.
for i in $HOME
Lo mismo pero con el directorio /home/usuario
Compliquemos un poco el asunto. En el bucle for, lista también puede ser un comando.
Pero este comando debe estar encerrado entre acentos graves.
Ejemplos Shell Script
3
Laboratorio de Sistemas Operativos
Ingenierías Técnicas en Informática de Sistemas y Gestión
2006/2007
__________________________________________________________________________________________
for i in `ls -R`
Ahora se recorrerán recursivamente todos los archivos que cuelgan del directorio desde
donde ejecutamos el script.
Alternativamente podemos obtener el mismo resultado con las siguientes líneas:
A=`ls -R`
for i in $A
Sin embargo, debe tenerse en cuenta qué valores toma la variable i en todos estos
casos. La orden `ls` obtiene los nombres de un cierto grupo de archivos. Si lo que
pretendemos en procesar dichos nombres, esta orden nos servirá. En cambio, una
orden como `ls –l` no nos será de utilidad, ya que se procesarán también los grupos
de archivos, usuarios, fecha, hora, etc. Es decir, la variable i del bucle for, irá tomando
sucesivamente valores como los grupos de archivos, usuarios, etc.
rwxr-xr-x, 1, jcarlos, users, 52, 2007-03-09, 20:32, ejemplo1, drwxr-
xr-x, 4, etc
- Asignación de valores a variables
Hemos visto que en shell script no hay tipos de variables. Éstas son asignadas en el momento
que se definen:
A=1
B=Ana
Pero también podemos asignarlas con el valor de la salida de un comando:
A=`comando`
A=$(comando)
A=`ls | wc -w` En este caso A tomará como valor el número de archivos del directorio
actual
A=$(ls | wc -w) Lo mismo que en el caso anterior
Como la asignación de variables es alfanumérica, podemos componer cualquier variable a
nuestra conveniencia sin más que concatenar variables:
A=Ana
B=Practica1
C=$A/$B toma el valor Ana/Practica1
Ejemplos Shell Script
4
Laboratorio de Sistemas Operativos
Ingenierías Técnicas en Informática de Sistemas y Gestión
2006/2007
__________________________________________________________________________________________
Esto puede ser muy útil para crear archivos o directorios que puedan ser identificados
fácilmente por algún criterio determinado. Por ejemplo, nos podría interesar ir guardando
sucesivas versiones de un cierto archivo del tal manera que se identifique el número de la
versión.
Supongamos que nuestro archivo es un programa denominado movcontables.c y que como
máximo hay 9 versiones. La n-enésima versión se denominará movcontables.c.n
Procederemos como sigue:
Introduciremos como argumento el valor movcontables.c.
Lo primero que hará el script es comprobar si existe el archivo movcontables.c. Si no
existe, el script presentará un mensaje acorde con el hecho y terminará.
En el caso de que exista, contamos el número de versiones existentes del archivo. Esto
lo hacemos con el comando ls $1* | wc -w. El valor resultante se lo asignamos a la
variable A.
A continuación incrementamos el valor de A. Como hemos dicho previamente, las
variables son alfanuméricas. Para poder operar con ellas de forma numérica hacemos
uso del operador expr y encerrado entre acentos graves. El resultado es asignado a la
variable Num mediante la orden Num=`expr $A + 1`
Posteriormente componemos la variable Version añadiendo al nombre del archivo
original una nueva extensión con el valor de la nueva versión: Version=$1.$Num
Copiamos el archivo movcontables.c
Finalmente creamos el archivo movcontables.c vacío y listo para ser codificado de
nuevo.
#!/bin/bash
echo $1 no existe
A=$(ls $1* | wc -w)
echo Se ha superado el número máximo de versiones
if [ ! -f “$1” ]
then
else
fi
if [ $A -ge 9 ]
then
else
fi
Num=`expr $A + 1`
Version=$1.$Num
cp $1 $Version
Ejemplos Shell Script
5
Laboratorio de Sistemas Operativos
Ingenierías Técnicas en Informática de Sistemas y Gestión
2006/2007
__________________________________________________________________________________________
1. Guión shell que copia todos los archivos de trabajo con extensión .dat y .c del directorio actual al
directorio pasado como argumento. Si est
Comentarios de: Ejemplos Shell Script (0)
No hay comentarios