Você está na página 1de 13

ARQUITECTURA DE COMPUTADORES

PRCTICA 4

El Shell de UNIX como lenguaje de


programacin (I)

Contenido
1.1 INTRODUCCION
1. 2. SHELL SCRIPTS
1.2.1 Argumentos en shell scripts
1.3 LAS COMILLAS
1.4 VARIABLES
1.4.1 Variables y comillas
1.4.2 Ambito de las variables
1.4.3 El entorno del shell
1.5 CONTROL DEL FLUJO (I)
1.5.1 Bucles con la sentencia for
1.5.2 Ejecucin condicional con la sentencia if
1.5.3 Las rdenes test y expr
1.6 EL FICHERO PROFILE

Introduccion
1.1 INTRODUCCION
El shell o intrprete de rdenes de UNIX es un programa ejecutable (como
cualquier otro programa de usuario) que se encuentra disponible en cualquier entorno
UNIX y cuyo cometido es leer rdenes para el sistema operativo, analizarlas y realizar
las llamadas al sistema que sean necesarias para ejecutarlas.
Este intrprete define, al igual que ocurre con cualquier otro intrprete o traductor,
un lenguaje de programacin que posee caractersticas como:

Variables.

Palabras y caracteres reservados (tambin conocidos como metacarateres).

Procedimientos, ms conocidos como shell scripts.

Estructuras para el control del flujo tipo if, while, etc.

Manejo de seales.

Realmente en un sistema UNIX existen varios intrpretes de rdenes, pudiendo


elegir cada usuario el que prefiera. El intrprete de rdenes ms bsico es el Bourne
shell, o sh, que est disponible en cualquier sistema. Otros intrpretes de rdenes
usuales son el Korn shell, o ksh, el shell con sintaxis del tipo de lenguaje C o csh y el
Bourne-Again Shell o bash que es totalmente compatible con el sh al tiempo que
incorpora caractersticas del ksh y csh.
Esta prctica introducir las caractersticas y la sintaxis del sh, las cuales resultan
tambin aplicables al ksh y al bash.

1.2 SHELL SCRIPTS


Las rdenes que el shell debe ejecutar pueden ser proporcionadas a travs del
teclado o como un programa contenido en un fichero. Se denomina shell script a todo
fichero que contenga rdenes para ser ejecutadas por el shell. Por ejemplo, se puede
crear un fichero denominado usuarios con el siguiente contenido:
# Programa usuarios
echo El nmero de usuarios es:
who | wc -l

Las lineas que comienzan por el carcter # son comentarios. La ejecucin de dicho
fichero puede realizarse de tres formas distintas:

1. Creando un shell no interactivo (no espera rdenes de teclado) y redirigiendo su


entrada al fichero usuarios:
$ sh < usuarios

2. Creando un shell no interactivo y pasndole el fichero usuarios como


argumento:
$ sh usuarios

3. Dando permiso de ejecucin al fichero usuarios y ejecutndolo como si fuese


otra orden:
$ chmod +x usuarios
$ usuarios

Probablemente el directorio desde el que tratas de ejecutar el shell script no est


includo en el path por lo que, si obtienes un mensaje de error, prueba
indicndole el directorio desde el que lo quieres ejecutar con:
$ ./usuarios

En este ltimo caso, el shell detecta que se trata de un shell script y, al igual que
en los casos anteriores crea otro shell para que lo ejecute.

1.2.1 Argumentos en shell scripts


Un shell script puede invocarse con argumentos, los cuales pueden ser referenciados
como $0, $1, $2, $3, etc. El argumento $0 referencia el propio nombre del programa, en
tanto que $* referencia todos los argumentos y $# indica el nmero de argumentos. Esto
se ilustra con el programa argumentos:
$ vi argumentos
# Programa argumentos.
echo Orden tecleada: $*
echo Nmero de argumentos: $#
echo Nombre de la orden: $0
echo Argumento 1: $1
echo Argumento 2: $2
echo Argumento 3: $3

que, despus de ponerle permisos de ejecucin, puede invocarse como:


$ argumentos pera uva limon

1.3 LAS COMILLAS


Dentro del conjunto de metacaracteres del shell existen tres tipos de comillas que tienen
distintos significados.
Las comillas simples evitan que el shell interprete las cadenas que delimitan, es
decir, consiguen que el shell trate el texto contenido entre las comillas como si
fuera un literal:
$ echo /bin/c*
$ echo /bin/c*

Para evitar la interpretacin de un carcter tambin puede utilizarse la barra invertida \:


$ echo *
$ echo *
$ echo \*

Las comillas dobles son muy semejantes a las comillas simples y tambin evitan la
interpretacin excepto s se da el caso del metacarcter $, que sirve para
referenciar variables. Su uso se ilustrar cuando se introduzcan las variables.
Las comillas inversas ` ` son muy diferentes a las comillas simples y dobles y permiten
que la salida de la orden que delimitan pueda utilizarse como argumento de otra
orden:
$
$
$
$
$

echo date
echo date
echo date
argumentos date
argumentos date

1.4 VARIABLES
El shell, como cualquier otro intrprete, permite la utilizacin de variables que en este
caso son siempre alfanumricas.
Creacin y modificacin de variables: Una variable se crea asignndole una cadena
de caracteres mediante el operador =. Este operador tambin permite modificar su
valor:
$ RUTA1=/bin
$ RUTA2=/usr/bin
$ yo=pepe

Referencias a variables: Las variables se pueden referenciar utilizando el operador $:


$
$
$
$

echo $RUTA1
echo $RUTA1 $yo
RUTAS=$RUTA1:$RUTA2/$yo
echo $RUTAS

1.4.1 Variables y comillas


Las comillas simples se utilizan para que los blancos y otros metacaracteres puedan
formar parte de una cadena:
$ saludo=Hola; que tal
$ echo $saludo
$ echo echo $RUTAS > rutas
$ cat rutas

Las comillas dobles permiten que el operador $ sea interpretado al asignar una variable:
$
$
$
$

echo
echo
echo
diff

rutas: - $RUTAS
rutas: - $RUTAS
"echo $RUTAS" > rutas2
rutas rutas2

Las comillas inversas permiten asignar una variable con la salida de una orden:
$ hoy=date
$ echo $hoy

1.4.2 mbito de las variables


Las variables del shell son accesibles, en principio, en el shell en que han sido creadas,
permaneciendo inaccesibles a cualquier otro proceso. Para ilustrar este aspecto, se
considerar la variable $RUTAS, creada anteriormente, y se comprobar su
inaccesibilidad desde un shell hijo:
$
$
$
$
$
$
$

echo $RUTAS
sh
ps
echo $RUTAS
exit
ps
echo $RUTAS

Para ejecutar un shell script debe crearse un shell hijo desde el que tampoco son
accesibles estas variables. Para comprobar este detalle ejecute el fichero rutas creado
anteriormente:
$ chmod +x rutas
$ rutas

No obstante, existe una forma de hacer accesible una variable a los procesos hijos de un
proceso shell consistente en la utilizacin de la orden interna (palabra reservada)
export:
$
$
$
$
$
$

echo $RUTAS
export RUTAS
sh
ps
echo $RUTAS
exit

$ ps
$ rutas

1.4.3 El entorno del shell


El conjunto de variables que forman el entorno del shell puede visualizarse utilizando la
orden interna set. Por otro lado, la orden interna env visualiza nicamente aquellas
exportables:
$ set
$ env

El shell tiene algunas variables que son de particular inters para el usuario. Cabe
destacar, entre otras, las siguientes:
# El
echo
# La
echo
# El
echo
# El
echo

directorio de arranque de un usuario


"HOME: $HOME
ruta por defecto. El carcter : se usa como separador
"PATH: $PATH
tipo de terminal
"TERM: $TERM
primer prompt
PROMPT: $PS1

Esto permite, por ejemplo, que el usuario pueda cambiar el prompt o modificar la ruta
por defecto:
$ PS1="[hostname] "
$ PATH=$PATH:$HOME/bin

1.5 CONTROL DEL FLUJO (I)


El shell posee sentencias para el control del flujo similares a las existentes en otros
lenguajes de programacin, tales como for, if...else, case, while. Los
siguientes subapartados describen su sintaxis e ilustran su utilizacin con diversos
ejemplos.

1.5.1 Bucles con la sentencia for


La sentencia for itera sobre una lista de valores y asigna en cada iteracin un valor a la
variable asociada. Su sintaxis:
for variable in lista de valores
do
sentencias
done
Por ejemplo, se puede utilizar un bucle for para visualizar los ficheros de /usr/bin que
empiezan por a, b y c:

$
>
>
>
>
>

for i in a b c
do
echo PROGRAMAS QUE EMPIEZAN POR /usr/bin/$i
echo --------------------------------------ls /usr/bin/$i*
done

Observe la aparicin del segundo prompt al utilizar una sentencia de control que abarca
varias lneas.
Los bucles for pueden anidarse. Por ejemplo, tal caracterstica puede ser til para escribir
un programa que cree un fichero, cuyo nombre sea numerado, que contenga 30 lneas
numeradas:
00:
01:
...
10:
11:
12:
...
28:
29:

Realice este programa en un shell script cuyo nombre sea for2.


$ vi for2
... (Aqu tenis que escribir el programa)
$ chmod +x for2
$ for2
...
$ cat numerado

Los bucles for difieren, fundamentalmente, en la forma en que se proporciona la lista de


valores. A continuacin se describen diversas formas de proporcionar esta lista.
La lista de valores de un bucle for puede ser la lista de argumentos de un shell script. Por
ejemplo, podra realizarse un fichero lsbin que visualice los ficheros de /usr/bin que
empiecen por cada una de las cadenas alfanumricas que se proporcionan como argumento
a lsbin.
$ vi 1sbin
for i in $*
do
echo PROGRAMAS QUE EMPIEZAN POR /usr/bin/$i
echo --------------------------------------ls /usr/bin/$i*
done
...
$ chmod +x lsbin
$ lsbin a b ca cu

La lista de valores de un bucle for tambin puede ser los ficheros del directorio actual.
Por ejemplo, el siguiente programa crea una copia de seguridad de cada uno de los
ficheros del directorio actual:
$ for k in *

>
>
>
>

do
cp $k $k.bak
echo Creada copia de $k
done

y el siguiente programa mueve estas copias de seguridad a un subdirectorio denominado


bak:
$
$
>
>
>
>

mkdir bak
for i in *.bak
do
mv $j bak/$j
echo Movido $i a bak/$j
done

Finalmente la lista de valores de un bucle for tambin puede provenir de la ejecucin


de una orden mediante comillas inversas. Por ejemplo, se puede registrar en un fichero
amigos los nombres de login de sus dos vecinos inmediatos y el suyo propio. Para
enviar su versin del programa for2 a sus "amigos" debera realizar:
$
>
>
>
>

for i in cat amigos


do
mail $i < for2
echo Enviando for2 a $i
done

1.5.2. Ejecucin condicional con la sentencia if


La sentencia if permite la ejecucin condicional de rdenes. Su sintaxis es:
if orden se ejecuta con xito
then
sentencias
else
sentencias alternativas
fi
Observe que la condicin de la sentencia if no es una expresin, sino una orden de
Unix. La condicin es cierta si la orden "termina correctamente" (en cuyo caso se
ejecutan las sentencias que siguen al then), y falsa en caso contrario (en cuyo caso
se ejecutan las sentencias que siguen al else). La clusula else es opcional.
Estado de terminacin de una orden
Una orden se dice que "termina correctamente" (o con xito) cuando la orden termina su
ejecucin sin dar ningn mensaje de error. En dicho caso, se dice que su estado de
termnacin vale 0. El estado de terminacin de la ltima orden ejecutada por el shell se
almacena en la variable de entorno $?. Observe su valor en la ejecucin de una orden
que no termina correctamente y en una que termina correctamente:
$ cp noexiste fich
...
$ echo $?

$ cp for2 fich
$ echo $?

Realice un programa copia que ejecute la orden cp y compruebe su estado de


terminacin:
$ vi copia
# Programa copia
if cp $1 $2 2>/dev/null
then
echo "$1 ha sido copiado a $2
else
echo "$1 no ha sido copiado a $2"
fi

La sentencia exit
La sentencia exit fuerza la terminacin inmediata de un fichero de rdenes (no se
ejecutan las sentencias que siguen a exit). El estado de terminacin del fichero de
rdenes puede ser proporcionado como parmetro de exit. Utilizando exit, se
puede completar el programa copia para que proporcione un estado de terminacin
distinto de cero en el caso en que la orden no funcione correctamente:
$ vi copia
# Programa copia
if cp $1 $2 2>/dev/null
then
echo "$1 ha sido copiado a $2"
exit 0
else
echo $1 no ha sido copiado a $2
exit 1
fi
$ copia noexiste fich
...
$ echo $?
$ copia for2 fich
$ echo $?

1.5.3 Las rdenes test y expr


La orden test es un programa ejecutable (no una orden interna) que permite evaluar
condiciones y, por lo tanto, resulta de gran utilidad para utilizarlo conjuntamente con la
sentencia if. El siguiente ejemplo ilustra su uso:
$ V1=cero
$ test $V1 = cero (OJO con respetar los espacios del _=_ !!)
$ echo $?

No obstante, su utilizacin suele estar asociada a la sentencia if. Por ejemplo, se


podra completar el programa copia para que compruebe el nmero de argumentos:

$ vi copia
# Programa copia
if test $# -ne 2
then
echo Uso de copia: copia fl f2
echo Observe que copia necesita dos argumentos
exit 1
fi
...
$ copia f1
...
$ echo $?

La notacin [ ] es una forma abreviada de ejecutar la orden test. De acuerdo con esto, la
anterior condicin puede escribirse tambin como:
$ vi copia
# Programa copia
if [$# -ne 2]
then
echo Uso de copia: copia fl f2
echo Observe que copia necesita dos argumentos
exit 1
fi
...

Los tipos de expresiones que puede evaluar la orden test son los siguientes:
Expresiones numricas. La forma general de las expresiones es:
N <operador> M
donde N y M son interpretados como valores numricos. Los operadores que se
pueden
utilizar son:
-eq
-ne
-gt
-lt
-ge
-le

N y M son iguales.
N y M son distintos.
N es mayor que M.
N es menor que M.
N es mayor o igual que M.
N es menor o igual que M.

Un ejemplo de utilizacin podra ser:


$ users=`who | wc l`
$ if test $users -gt 8
> then echo "Ms de ocho personas conectadas"
>fi

Expresiones alfanumricas. La forma general de las expresiones es:


S <operador> R
donde S y R son cadenas alfanumricas. Los operadores que se pueden utilizar
son:
= las cadenas S y R son iguales.
= las cadenas S y R son distintas.
Note la diferencia entre la interpretacin de S y R como cadenas alfanumricas o como
nmeros en el fichero de rdenes iguales:
$ vi iguales
if test $1 = $2
then echo Cadenas alfanumricamente iguales
fi
if test $1 = $2
then echo Cadenas alfanumricamente iguales
blancos)
fi
if test $1 -eq $2
then echo Cadenas numricamente iguales
fi

(eliminando

$ num1=0001
$ num2=1
$ num3= 1
$ iguales $num1 $num2
...
$ iguales $num2 $num3

Tipos de ficheros. La forma general de las expresiones es:


<opcin> fichero
Las opciones que se pueden utilizar son:
-s
-f
-d
-r
-w
-x

comprueba que el fichero existe y no est vaco.


comprueba que el fichero existe y es regular (no directorio).
comprueba si el fichero es un directorio.
comprueba si el fichero tiene permiso de lectura.
comprueba si el fichero tiene permiso de escritura.
comprueba si el fichero tiene permiso de ejecucin.

A continuacin se ofrece un ejemplo de utilizacin:


$ vi ejec
if [-x $1]
then echo "$1 es ejecutable"
else echo "$1 no es ejecutable o no existe"
fi
...
$ ejec noexiste
...
$ ejec for2

Operadores 'and' y 'or'. Se pueden combinar varios operadores en una sola orden test
mediante los operadores -o y -a que representan el "o lgico" e "y lgico"
respectivamente. A continuacin se ofrece un ejemplo de utilizacin:
$ vi append
if test -w $2 -a -r $1
then cat $1 >> $2
else echo "No se puede aadir $1 a $2"
fi
...
$ append numerado a1

La orden expr permite evaluar expresiones aritmticas. Los operadores que admite
son: +, -, *, / , %. El operador * hay que "escaparlo" para que el shell no lo interprete
como el comodn.
$ expr $num2 + 3 + 4

(OJO con los espacios!!!!!)

$ expr 2 * 6

1.6 EL FICHERO PROFILE


Cuando el shell se pone en ejecucin al iniciar una sesin, comienza por ejecutar un
fichero de rdenes denominado .profile, que se encuentra en el directorio del
usuario correspondiente.
Este fichero contiene, tpicamente, rdenes para configurar el terminal tales como:
$ eval tset -s Q
$ stty erase ^H kill ^U

y para establecer la ruta de defecto:


PATH=.:/bin:/usr/bin:/usr/contrib/bin:/usr/local/bin:/usr/hosts

y puede ser personalizado por cada usuario.

Você também pode gostar