Академический Документы
Профессиональный Документы
Культура Документы
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.
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