Вы находитесь на странице: 1из 19

Laboratorio de Visualizacin Matemtica (http://valle.fciencias.unam.

mx)
ACERCA DE LA PROGRAMACIN
EN EL SHELL DE UNIX
Juan Fiacro Hernndez Cruz

18 de Marzo de 1998
ndice General
1 INTRODUCCIN 1
2 VARIABLES EN EL SHELL DE UNIX 2
3 CONDICIONALES 7
4 CICLOS 11
5 BIBLIOGRAFA 19
1 INTRODUCCIN
El SHELL de UNIX cuenta con un interprete de comandos que permite
programar sosticadamente y lo ms probable es de que un usuario de unix
gaste mucho tiempo interactuando con el SHELL y el comprender bien su
potencia puede incrementar su productividad.
Aunque existen tres tipos de SHELL (Bourne SHELL, Korn SHELL y C
SHELL) este artculo tratara slo de la programacin en el Bourne SHELL.

PEMEX-REFINACIN, SUBDIRECCIN DE DISTRIBUCIN, UNI-


DAD DE SISTEMAS Y APOYO LOGSTICO, COORDINACIN DE IN-
GENIERA DE SISTEMAS
1
Laboratorio de Visualizacin Matemtica (http://valle.fciencias.unam.mx)
Se supondra que el lector ya tiene conocimiento del sistema operativo
UNIX, excepto de la programacin en el SHELL de UNIX y que al terminar
de leer este artculo podra escribir y ejecutar programas en SHELL utilizando
cualquiera de las facilidades del SHELL.
2 VARIABLES EN EL SHELL DE UNIX
En el shell de unix el usuario puede denir sus propias variables y existen
variables predenidas las cuales podemos redenir, exportarlas al ambiente
y obtener sus valores.
En el shell de unix podemos tener subshells, pasamos a un subshell con
sh<ENTER>y regresamos al shell anterior con <CTRL>-d o exit<ENTER>
VARIABLES DEFINIDAS POR EL USUARIO
Para los nombres de variables podemos usar letras maysculas o mins-
culas, nmeros o guin bajo pero no pueden empezar con un nmero.
Para asignar valor a una variable debe usarse el caracter = y para recu-
perar el valor de una variable debe anteponerse el caracter $ al nombre de
variable.
Ejemplo 1.-
Sea /usr/juan un directorio, entonces
$mis_archs=/usr/juan <ENTER> Se asigna valor a la variable mis_archs
$ls $mis_archs <ENTER> Listamos el contenido del directorio /usr/juan
Ejemplo 2.-
$fecha_hora=date <ENTER> Se asigna la fecha y hora a la variable fecha_hora
$echo $fecha <ENTER> Desplegamos en pantalla la fecha y hora
El valor de una variable slo es valido en el shell actual y cuando se
exporta el valor tamin es valido en los subshells pero no en el shell padre.
Ejemplo 3.- Ejemplo 4.-
2
Laboratorio de Visualizacin Matemtica (http://valle.fciencias.unam.mx)
$x=3<ENTER>
$sh<ENTER>
$y=5<ENTER>
$echo $x<ENTER>
$<CTRL-d>
$echo $y<ENTER>
$echo $x<ENTER>
3
$
$mje1=hola1<ENTER>
$export mje1<ENTER>
$sh<ENTER>
$mje2=hola2<ENTER>
$export mje2<ENTER>
$echo $mje1<ENTER>
hola1
$<CTRL-d>
$echo $mje2<ENTER>
$echo $mje1<ENTER>
hola1
$
VARIABLES DEL SHELL DE UNIX
El shell tiene sus propias variables predenidas, las cuales podemos rede-
nir, exportarlas al ambiente y obtener sus valores. Dentro de las variables
de shell tenemos,
PATH Trayectoria de busqueda de comandos y archivos ejecutables
LOGNAME Login del usuario
PS1 Prompt primario
PS2 Prompt secundario
SHELL Trayectoria del shell en uso
HOME Trayectoria del directorio al que entramos al iniciar la sesin
TERM Emulacin de la terminal en uso
VARIABLES ESPECIALES PREDEFINIDAS
$0 Nombre del programa en ejecucin
$1...$9 Parmetros posicionales
$$ I. D. de proceso
$! ltimo en background
$- Opciones de shell
$* Todos los argumentos, como uno
$@ Todos los argumentos
$# Nmero de argumentos
$? Estatus
SUSTITUCIN DE VARIABLES
3
Laboratorio de Visualizacin Matemtica (http://valle.fciencias.unam.mx)
${nom_var:-comando}
Se utiliza el valor de nom_var si no es nulo en caso contrario se utiliza el
comando pero no se asigna el nombre de comando a la variable.
Ejemplo 5.- Ejemplo 6.-
$x=<ENTER>
$${x:-ls}<ENTER>
$Listado del directorio actual
$eccho $x<ENTER>
$
$x=clear<ENTER>
$${x:-ls}<ENTER>
$Se limpia la pantalla
$eccho $x<ENTER>
clear
$
${nom_var:=comando}
Se utiliza el valor de nom_var si no es nulo en caso contrario se utiliza el
comando y se asigna el nombre de comando a la variable.
Ejemplo 7.- Ejemplo 8.-
$x=<ENTER>
$${x:=date}<ENTER>
Wue Mar 18 11:12:37 CST 1998
$eccho $x<ENTER>
date
$
$x=clear<ENTER>
$${x:=ls}<ENTER>
Se limpia la pantalla
$eccho $x<ENTER>
clear
$
${nom_var:?mensaje}
Se utiliza el valor de nom_var si no es nulo en caso contrario se envia
mensaje a la salida de error estandar.
Ejemplo 9.- Ejemplo 10.-
$x=<ENTER>
$${x:?Variable sin valor}<ENTER>
x: Variable sin valor
$
$x=date<ENTER>
$${x:?Variable sin valor}<ENTER>
Wue Mar 18 11:12:37 CST 1998
$
La sentencia read es un comando interno que sirve para leer de la entrada
estandar el valor de una variable y puede cargar una o ms palabras en una
variable.
Ejemplo 11.-
4
Laboratorio de Visualizacin Matemtica (http://valle.fciencias.unam.mx)
$read x<ENTER>
4 7<ENTER>
$eccho $x<ENTER>
4 7
$
La sentencia readonly es un comando interno que sirve para proteger a
una variable contra escritura en el shell actual.
Ejemplo 12.-
$x=5<ENTER>
readonly x<ENTER>
$x=7<ENTER>
x: is readonly
$echo $x<ENTER>
5
$
La sentencia shift es un comando interno que sirve para hacer un corri-
miento a la izquierda de los parmetros posicionales, con la siguiente sintaxis,
$shift [n]<ENTER> Corrimiento de n en n de los parmetros posicionales,
y si n no se asigna el corrimiento sera de uno en uno
La sentencia set es un comando interno que sirve para asignar valor a
los parmetros posicionales de acuerdo a los valores que se incluyan en una
variable o segn los valores que se listen despus de set, con la siguiente
sintaxis,
$set $nom_var<ENTER>
$set val1 val2 val3 ..val9<ENTER>
set tambin nos sirve para poder asignar valor a las variables de programa
en la lnea de comandos con la siguiente sintaxis,
$set -k<ENTER> Activa la opcin
$set +k<ENTER> Desactiva la opcin
Ejemplo 13.-
$pg nom_prog1<ENTER>
echo $1 $2 $3 $4 $5 $6
5
Laboratorio de Visualizacin Matemtica (http://valle.fciencias.unam.mx)
todos_par=$*
shift
echo $1 $2 $3 $4 $5 $6
set $todos_par
echo $1 $2 $3 $4 $5 $6
echo $*
$chmod u+x nom_prog1<ENTER>
$nom_prog1 1 2 3 4 5 6 7<ENTER>
1 2 3 4 5 6
2 3 4 5 6 7
1 2 3 4 5 6
1 2 3 4 5 6 7
$
Ejemplo 14.-
$set -k<ENTER>
$pg nom_prog<ENTER>
echo $1 $nom_var $2
$chmod u+x nom_prog<ENTER>
$nom_prog 1 nom_var=2 3<ENTER>
1 2 3
$
La sentencia eval es un comando interno que sirve para leer argumentos
y enviarlos al shell para su ejecucin.
Ejemplo 15.-
$var_x=ls /usrs/juan<ENTER>
$echo $x<ENTER>
ls /usrs/juan
$eval $var_x<ENTER>
listado del directorio /usrs/juan
$
6
Laboratorio de Visualizacin Matemtica (http://valle.fciencias.unam.mx)
3 CONDICIONALES
La sentencia if sirve para ejecutar un bloque de instrucciones siempre que
sea verdadera una lista de comandos u otro bloque de instrucciones si la lista
de comandos es falsa, con la siguiente sintaxis,
if lista_comandos_1
then
bloque_instrucciones_1
elif lista_comandos_2
then
bloque_instrucciones_2
else
bloque_instrucciones_3

La sentencia case sirve para ejecutar uno de varios bloques de instruccio-


nes siempre que el string despus del case coincida con alguna de las opciones
listadas. Cada bloque de instrucciones debe terminar con ;; y las opciones
pueden incluir los caracteres *, ?, [, ] adems una de las opciones puede ser
*) la cual se cumple cuando no coincide el string con alguna de las dems
opciones.
La sintaxis es,
case string in
opcion_1_1|..|opcion_1_n) bloque_instrucciones_1;;

opcion_n_1|..|opcion_n_n) bloque_instrucciones_n;;
*) bloque_instrucciones_x;;
esac
Ejemplo 16.-
$nom_var=calculo<ENTER>
$case $nom_var in<ENTER>
>a|algebra) prog_alg;;<ENTER>
7
Laboratorio de Visualizacin Matemtica (http://valle.fciencias.unam.mx)
>c|calculo) prog_cal;;<ENTER>
>e|ecuaciones) prog_ecu;;<ENTER>
>*) echo No existe programa para esta opcin;;<ENTER>
>esac<ENTER>
Se ejecuta el programa prog_cal
$
La sentencia test es un comando interno que se usa para validar atributos
de archivos, comparaciones numericas y de cadenas. Se obtiene un estatus
de 0 si la validacin fue verdadera y diferente de 0 si la validacin fue falsa
Opciones para validar archivos,
Opcin Signicado
-b Archivo especial de bloque
-c Archivo especial de caracter
-f Archivo
-d Directorio
-r De lectura
-w De escritura
-x De ejecucin
-s Mayor de 0 bytes de longitud
Ejemplo 17.-
Para validar si existe el archivo nom_arch en el directorio actual podemos
teclear las siguientes instrucciones,
$if test -f nom_arch<ENTER>
>then<ENTER>
>echo El archivo nom_arch si existe<ENTER>
>else<ENTER>
>echo El archivo nom_arch no existe<ENTER>
><ENTER>
El archivo nom_arch [si,no] existe
$eccho $?<ENTER>
[0 si existe,diferente de 0 si no existe]
$
Opciones para validar cadenas,
8
Laboratorio de Visualizacin Matemtica (http://valle.fciencias.unam.mx)
Opcin Signicado
-z Cadena con longitud cero
-n Cadena con longitud diferente de cero
s1 Cadena no nula
! Cadenas diferentes
= Cadenas iguales
Ejemplo 18.-
$a=algebra<ENTER>
$b=g_analitica<ENTER>
$if test $a = $b<ENTER>
>then<ENTER>
>echo Variables de cadena con valor igual<ENTER>
>else<ENTER>
>echo Variables de cadena con valor diferente<ENTER>
><ENTER>
Variables de cadena con valor diferente
$
Operadores relacionales,
Operador Signicado
-gt Mayor que
-lt Menor que
-ge Mayor o igual que
-le Menor o igual que
-ne Diferente a
-eq Igual a
Ejemplo 19.-
$x=3<ENTER>
$y=5<ENTER>
$if test $x -ne $y<ENTER>
>then<ENTER>
>echo Valores numericos diferentes<ENTER>
><ENTER>
9
Laboratorio de Visualizacin Matemtica (http://valle.fciencias.unam.mx)
Valores numericos diferentes
$
Operadores lgicos,
Operador Signicado
-o Operador OR
-a Operador AND
! Negacin unaria
|| OR condicional
&& AND condicional
Ejemplo 20.-
Si en el directorio actual no existe el archivo arch1 entonces,
$ test -f arch1||echo El archivo arch1 no existe<ENTER>
El archivo arch1 no existe
$
Ejemplo 21.-
Si en el directorio actual existe el archivo arch1 entonces,
$ test -f arch1&&echo El archivo arch1 si existe<ENTER>
El archivo arch1 si existe
$
Opcionalmente a la sentencia test podemos usar [ ] con las mismas op-
ciones que test
Ejemplo 22.-
$a=calculo<ENTER>
$b=calculo<ENTER>
$if [ $a = $b ]<ENTER>
>then<ENTER>
>echo Variables de cadena con valor igual<ENTER>
>else<ENTER>
>echo Variables de cadena con valor diferente<ENTER>
><ENTER>
Variables de cadena con valor igual
$
10
Laboratorio de Visualizacin Matemtica (http://valle.fciencias.unam.mx)
4 CICLOS
El comando interno expr se usa para efectuar operaciones aritmeticas, rela-
cionales y de cadena.
Operador aritmetico Signicado
+ suma
- resta
\* multiplicacin
/ divisin
% residuo
Operador relacional Signicado
= igual a
!= diferente a
\> mayor que
\>= mayor o igual que
\< menor que
\<= menor o igual que
Operador de cadena Signicado
: .* longitud de cadena
Ejemplo 23.-
$x=2<ENTER>
$z=9<ENTER>
$expr $z \% $x<ENTER>
1
$
Ejemplo 24.-
$x=3<ENTER>
$y=6<ENTER>
$expr $x \< $y<ENTER>
1
$
Ejemplo 25.-
$val_cad=geometria<ENTER>
$expr $val_cad : .*<ENTER>
9
11
Laboratorio de Visualizacin Matemtica (http://valle.fciencias.unam.mx)
$
La sentencia for se usa para iteraciones controladas , de un grupo de
comandos. Con la siguiente sintaxis,
for nom_var in lista_palabras
do
grupo de comandos
done
El comando interno break se usa para romper un ciclo y break n rompe
n ciclos.
El comando interno continue se usa para terminar una iteracin y con-
tinue n se usa para terminar n iteraciones.
El comando interno exit se usa para terminar con la ejecucin de progra-
ma .y exit n se usa para terminar con la ejecucin de programa y asigna n
al estatus de salida.
Para poder ejecutar un programa en unix tenemos tres opciones,
1) Asignar permisos de ejecucion al programa
2) Anteponer sh al nombre de programa
3) anteponer . al nombre de programa
Ejemplo 26.-
$cat > pru_for<ENTER>
for i in $*<ENTER>
do<ENTER>
who|grep $i<ENTER>
done<ENTER>
<CTRL>-d
$sh pru_for juan alvaro<ENTER>
juan ttyp1 Mar 18 10:11
alvaro ttyp3 Mar 18 09:05
$
Ejemplo 27.-
$for i in ls<ENTER>
12
Laboratorio de Visualizacin Matemtica (http://valle.fciencias.unam.mx)
>do<ENTER>
> grep -l ecuaciones $i<ENTER>
>done<ENTER>
lista de archivos del directorio actual que tienen al menos una ocurrencia
de la palabra ecuaciones
$
Ejemplo 28.-
$cat > pru_break1<ENTER>
for i in 1 2 3 4 5 6<ENTER>
do<ENTER>
echo Ir a seminario<ENTER>
if (expr $i = 2 > /dev/null)<ENTER>
then<ENTER>
break<ENTER>
<ENTER>
done<ENTER>
<CTRL>-d
$sh pru_break1<ENTER>
Ir a seminario
Ir a seminario
$
Ejemplo 29.-
$cat > pru_comtinue1<ENTER>
for i in 1 2 3 4 5<ENTER>
do<ENTER>
if (expr $i = 2 > /dev/null)<ENTER>
then<ENTER>
continue<ENTER>
<ENTER>
echo Ir a conferencia<ENTER>
done<ENTER>
<CTRL>-d
13
Laboratorio de Visualizacin Matemtica (http://valle.fciencias.unam.mx)
$sh pru_continue1<ENTER>
Ir a conferencia
Ir a conferencia
Ir a conferencia
Ir a conferencia
$
La sentencia while se usa para iteraciones condicionales de un grrupo de
comandos, con la siguiente sintaxis,
while lista_comandos
do
grupo_comandos
done
Ejemplo 30.-
$cat > menu<ENTER>
op=0<ENTER>
while true <ENTER>
do<ENTER>
clear<ENTER>
echo 1) Fecha y hora<ENTER>
2) Usuarios<ENTER>
3) Procesos<ENTER>
4) Salir<ENTER>
echo De su opcin:\c<ENTER>
read op<ENTER>
case $op in<ENTER>
1) date; echo Cualquier tecla para continuar\c<ENTER>
read a;;<ENTER>
2) who; echo Cualquier tecla para continuar\c<ENTER>
read a;;<ENTER>
3) ps -f; echo Cualquier tecla para continuar\c<ENTER>
read a;;<ENTER>
1) exit;;<ENTER>
*) echo Opcin invalida;;<ENTER>
esac<ENTER>
14
Laboratorio de Visualizacin Matemtica (http://valle.fciencias.unam.mx)
done<ENTER>
<CTRL>-d
$
La sentencia until se usa para iteraciones condicionales de un grupo de
comandos y es equivalente a while-not.
Ejemplo 31.-
$cat > pru_until<ENTER>
until clear;; echo Cuadrado del numero:\\c; read a<ENTER>
test $a -eq 0<ENTER>
do<ENTER>
expr $a \* $a<ENTER>
echo Cualquier tecla para continuar \c; read c<ENTER>
done<ENTER>
<CTRL>-d
$
APLICACIONES
Dentro de las aplicaciones de la programacin en el shell de unix tenemos,
procedimientos de respaldo y recuperacin de informacin, personaalizacin
de comandos e instalacin de software.
Ejemplo 32.-
Si queremos respaldar todos los archivos que se encuentran en el directorio
/usrs/juan/apl_infor y la base de datos en informix que se llama bd_pru,
entonces
podemos usar el siguiente programa

SHELL : res_apl_bd
OBJETIVO : ESTE SHELL RESPALDA EN CINTA LOS ARCHIVOS DEL
DIRECTORIO /usrs/juan/apl_infor Y LA BASE DE DATOS bd_pru
USO : $ res_apl_bd<ENTER>
PROGRAMADOR : MAT. JUAN FIACRO HERNANDEZ CRUZ
clear
echo Se hara el respaldo de los archivos del directorio /usrs/juan/apl_infor
echo Tambien se respaldara la base de datos
echo Prepare dos cartuchos por favor
15
Laboratorio de Visualizacin Matemtica (http://valle.fciencias.unam.mx)
echo
echo Inserte un cartucho para respaldar /usrs/juan/apl_infor y de <RETURN>
read x
nd /usrs/juan/apl_infor -print|cpio -ov > /dev/rmt/c0s0
echo
echo El respaldo termino. Presione cualquier tecla para continuar
read x
clear
echo Inserte un cartucho para respaldar lar la base de datos bd_pru y
de
<RETURN>
read x
dbexport -t /dev/rmt/c0s0 -b 16 -s 150000 bd_pru
echo
echo El respaldo termino. Presione cualquier tecla para continuar
read x
clear
Ejemplo 33.-
Si tenemos una base de datos en informix y queremos un manual de la
base de datos, entonces podemos usar el siguiente programa

SHELL : MAN_BD
OBJETIVO : ESTE SHELL GENERA UN MANUAL DE LAS TABLAS DE
CUALQUIER BASE DE DATOS DE INFORMIX.
PARAMETROS : $1=EL NOMBRE DE LA BASE DE DATOS
USO : $ man_bd $1 > arch_manual <ENTER>
PROGRAMADOR : MAT. JUAN FIACRO HERNANDEZ CRUZ DIC, 1994
echo info tables > tablas.sql
cp tablas.sql .t
cont=0
rm x
for i in isql $1 tablas|grep -v Table |grep -v name|grep -v sys
do
echo $i >> x
done
sed 1,$ s/\informix\\.// x > tablas
rm x xx
16
Laboratorio de Visualizacin Matemtica (http://valle.fciencias.unam.mx)
for i in cat tablas
do
cont=expr $cont + 1
echo $i ....................................................... $cont >>xx
done
echo >> tablas.
echo TABLAS DEL SISTEMA $1 >> tablas.
echo >> tablas.
echo >> tablas.
echo NDICE >> tablas.
echo >> tablas.
echo >> tablas.
echo TABLAS PGINA >> tablas.
echo >> tablas.
cat tablas. xx > tablas.sql
rm x xx tablas tablas.
cut -c1-60 tablas.sql > x
cut -c61- tablas.sql > xx
grep \. xx > xxx
cut -c1 xxx > xx
mv xx xxx
cont=0
rm xx
for i in cat xxx
do
cont=expr $cont + 1
echo $cont >> xx
done
rm xxx
for i in 1 2 3 4 5 6 7
do
echo >> xxx
done
echo PGINA >> xxx
echo >> xxx
cat xxx xx > t
mv t xx
paste -d x xx >tablas.sql
17
Laboratorio de Visualizacin Matemtica (http://valle.fciencias.unam.mx)
rm x xx xxx
dd if=tablas.sql of=x conv=ucase
mv x tablas.sql
cat tablas.sql
echo <CTRL>-l
mv .t tablas.sql
cont=0
for i in isql $1 tablas|grep -v Table |grep -v name|grep -v sys
# for i in cat tablas.sql
do
cont=expr $cont + 1
echo
echo Pag. $cont
echo
echo
echo $i
echo
echo info columns for $i > $i.sql
isql $1 $i | sed s/Column name /Nombre columna/ | sed s/Type/Tipo/g|
sed s/Nulls/Nulos/ | sed s/yes/si/
rm $i.sql
echo
echo info indexes for $i > $i.sql
isql $1 $i | sed s/Index name/Nombre indice/ | sed s/Owner/Dueo/
| \
sed s/Columns/Columnas/ | \
sed s/Type/Tipo/ > $in.sql
ls -l $in.sql|cut -c39-40 > x
sed s/^/a=/ x > xx
echo if [ $a -ne 57 ] >> xx
echo then >> xx
echo cat $in.sql >> xx
echo >> xx
chmod +x xx
./xx
rm $i.sql
rm $in.sql
echo <CTRL>-l
18
Laboratorio de Visualizacin Matemtica (http://valle.fciencias.unam.mx)
done
rm tablas.sql
Ejemplo 34.-
Si tenemos un archivo tal que algunas lneas del archivo comienzan con
.nmero y queremos saber cual es el numero de lnea en donde se encuentra
alguna de estas cadenas, entonces podemos usar el siguiente programa

SHELL: no_linea
OBJETIVO: Este programa muestra el numero de linea del archivo en donde
estan ubicados los caracteres .n y que se encuntran al inicio de la linea
PARAMETROS: n numero buscado
USO : $no_linea n<ENTER>
AUTOR: MAT. Juan F. Hernandez Cruz
a=grep -n ^\.$1 x|cut -f1 -d:
echo $a
exit $a
5 BIBLIOGRAFA
1)El entorno de programacin UNIX
Brian W. Kernigan, Rob Pike
PHH-Prentice Hall
2)UNIX Sistema V Versin 4
Kenneth H. Rosen, Richard R. Rosinski, James M Farber
Mc Graw Hill
19

Вам также может понравиться