Escolar Documentos
Profissional Documentos
Cultura Documentos
LICENCIATURA EN INFORMÁTICA
2291
1
ÍNDICE
CARÁTULA-------------------------------------------------------------------------------------------------1
INTRODUCIÓN--------------------------------------------------------------------------------------------3
CONTENIDO-----------------------------------------------------------------------------------------------5
Programación Shell en Linux
¿Qué es Shell?
Shells disponibles en Linux
Principios de los Shell, Operación de los Shells y conceptos básicos de sintaxis--------------6
Estructuras de Control------------------------------------------------------------------------------------7
Secuencias Condicionales : IF ... FI
Control de Flujo------------------------------------------------------------------------------------------8
Estructura CASE
Lazos FOR----------------------------------------------------------------------------------------9
Bucle WHILE-------------------------------------------------------------------------------------10
Bucle UNTIL
BREAK & CONTINUE
Ciclos de Control
El ciclo While-----------------------------------------------------------------------------------11
El ciclo For--------------------------------------------------------------------------------------13
Control de Ciclos----------------------------------------------------------------------------------------14
Secuencia Condicional CASE … ESAC----------------------------------------------------------15
Bucles FOR--------------------------------------------------------------------------------------17
Bucles WHILE-----------------------------------------------------------------------------------19
Sintaxis De Las Sentencias De Control------------------------------------------------------------------20
CASE ... IN ... ESAC
IF ... THEN ... FI----------------------------------------------------------------------------------21
FOR ... DO ... DONE-----------------------------------------------------------------------------22
WHILE ... DONE---------------------------------------------------------------------------------23
UNTIL ... DONE
Estructuras Condicionales y Selectivas------------------------------------------------------------------24
Estructuras Condicionales
Estructura Selectiva-----------------------------------------------------------------------------26
Bucles----------------------------------------------------------------------------------------------------28
Bucles Genéricos
Bucles Condicionales While & Until------------------------------------------------------------30
Bucle de Selección Interactiva------------------------------------------------------------------31
CONCLUSIONES-----------------------------------------------------------------------------------------32
BIBLIOGRAFÍA--------------------------------------------------------------------------------------------33
MESOGRAFÍA
2
INTRODUCCIÓN
3
El shell estándar distribuido con Unix y Linux, se deriva de la distribución de AT&T,
el cual a su vez, evoluciono de una versión originalmente escrita por Stephen
Bourne en los laboratorios Bell. Desde entonces la IEEE ha creado estándares
basados en el Bourne Shell y otros shells más recientes. La versión actual de este
estándar es "The Shell and Utilities Volume of IEEE Std 1003.1-2001", también
conocido como es estándar POSIX (Portable Operating System Unix)
Debido a que el shell ofrece un lenguaje de programación interpretado, se pueden
escribir, modificar y verificar programas rápidamente y de forma fácil.
La programación en shell es una parte fundamental de la administración de
sistemas basados en Unix, debido a la facilidad y poderío que el conjunto de
herramientas y comandos de Unix proveen para realizar la automatización de
procesos rutinarios, tales como: respaldo de archivos, captura de datos, verificación
de procesos, etc.
4
CONTENIDO
¿Qué es Shell?
Unos dicen que es el sistema operativo, otros dicen que es una pantalla negra sin
sentido y anticuada, otros dicen que es la causa de que Linux no sea famosa entre
gente inexperta. ¿quién tiene la razón? Hagan sus apuestas!!! No, ahora en serio.
NO es el sistema operativo (el sistema operativo es el software que dirige la
computadora, habla con el hardware, carga y ejecuta programas, etc.); cuando se
ve el indicador de la computadora y se escriben comandos para ejecutar, con lo
que estamos tratando es con el shell.
Una característica interesante de Linux, es que los shells son completamente
independientes. Como usuario tenemos la libertad de elegir entre uno u otro shell.
También es posible interactuar con un shell, y escribir comandos para otro.
5
Principios de los Shell, Operación de los Shells y conceptos básicos de sintaxis
Esta línea se conoce como línea de comandos; que consiste en un comando y una
o más opciones (y/o argumentos). Por lo general el espacio en blanco se ignora. En
Linux los comandos son sensibles al uso de mayúsculas y minúsculas, cosa que no
pasa en Windows. El comando se termina pulsando la tecla Enter; aunque se puede
continuar el comando en una nueva línea usando backslash (\).
6
Estructuras de Control
if [ <variable> = <valor> ] : variable es igual a valor. Ojo con los espacios en „=„ .
if [ <variable> != <valor> ] : variable es distinta a valor.
if [ <variable -eq <valor> ] : variable es igual a valor . La variable debe contener
números. En éste caso , valen las comparaciones siguientes :
7
En el campo <condición> vale escribir comandos, los cuales se ejecutarán y el valor
de la
condición dependerá de dos factores :
Control de Flujo
Estructura CASE
case valor in
patrón_1)
comandos si value = patrón_1
comandos si value = patrón_1 ;;
patrón_2)
comandos si value = patrón_2 ;;
*)
comandos por defecto ;;
esac
8
Ejemplo:
#!/bin/bash
echo -n "Respuesta:" read RESPUESTA
case $RESPUESTA in
S* | s*)
RESPUESTA="SI";;
N* | n*)
RESPUESTA="NO ";;
*)
RESPUESTA="PUEDE";;
esac
echo $RESPUESTA
Lazos FOR
Ejemplos
LISTA="10 9 8 7 6 5 4 3 2 1"
for var in $LISTA
do
echo $var
done
dir="/var/tmp"
for file in $dir/*.bak
do
rm -f $file
done
Sintaxis alternativa, similar a la de C
LIMIT=10
for ((a=1, b=LIMIT; a <= LIMIT; a++, b--))
do
echo "$a-$b"
done
9
Bucle WHILE
while comando
do
comandos
done
Ejemplo:
while [ $1 ]
do
echo $1
shift
done
Bucle UNTIL
until comando
do
comandos
done
Ejemplo:
until [ "$1" = ""]
do
echo $1
shift
done
10
Ejemplo con break:
# Imprime el contenido de los ficheros hasta que
# encuentra una línea en blanco
for file in $*
do
while read buf
do
if [ -z "$buf"]
then
break 2
fi
echo $buf
done < $file
done
Ciclos de Control
Los dos tipos principales de ciclos son:
- el ciclo While
- el ciclo For
El ciclo while permite ejecutar un conjunto de comandos de forma repetida hasta
que una condición ocurra.
El ciclo for permite ejecutar un conjunto de comandos de forma repetida por cada
elemento en una lista.
El ciclo While
La sintaxis básica del ciclo while es:
while comando
do
sentencias
done
Donde comando es normalmente una expresión del comando test (aunque
también puede ser un comando para ejecutar).
sentencias se refiere a el cuerpo del ciclo while y contiene el código a ejecutar en
cada iteración del ciclo. Las sentencias do y done son utilizadas por el comando
while para saber en qué partes inicia y termina el ciclo.
La ejecución de un ciclo while es de la siguiente manera:
1.- se ejecuta el comando
2.- si el código de salida del comando es diferente de cero, el ciclo no se ejecuta
11
3.- si el código de salida del comando es cero, las sentencias del cuerpo del ciclo se
ejecutan
4.- se regresa al paso numero 1
Si tanto el comando como las sentencias son pocos o muy cortos se puede
codificar de la siguiente manera:
while command; do sentencias; done
Control de flujo
Un pequeño ejemplo que usa el ciclo while para desplegar números del cero al
nueve
x=0
while [ $x -lt 10 ]
do
echo $x
x=$((x+1))
done
Cada vez que el ciclo se ejecuta, se verifica si la comparación inicial [ $x -lt 10 ] es
verdadera, en caso de que no sea verdadera, el ciclo termina.
También se pueden crear comandos while anidados:
while comando1
do
sentencias1
while comando2
do
sentencias2
done
sentencias3
done
Como un ejemplo podríamos ejecutar este código:
x=0
while [ "$x" -lt 10 ]
do
y="$x"
while [ "$y" -ge 0 ]
do
echo -n "$y "
y=$((y - 1))
done
echo
x=$((x+1))
done
12
El ciclo For
A diferencia del ciclo while, el cual sale del ciclo cuando una condición es falsa, el
ciclo for opera en base a una lista de datos. El ciclo for repite un set de comandos
por cada dato en la lista.
La sintaxis básica del ciclo for es:
for variable in dato1 dato2 dato3 ... datoN
do
sentencias
done
Donde variable es el nombre de una variable y dato1 a datoN son secuencias de
caracteres o números separados por espacios. Cada vez que el ciclo for se ejecuta
el valor de cada dato en la lista es almacenado en la variable.
Lo cual significa que las veces que el ciclo for ejecutara las sentencias depende del
número de palabras, datos o sentencias especificados en la lista, por ejemplo:
Si se especificara la siguiente lista de datos en un ciclo for:
a veces no hay nada el ciclo se ejecutaría 4 veces.
Por ejemplo:
for x in 1 2 3 4 5 6 7 8
do
echo $x
done
13
Control de Ciclos
Cuando revisamos el comando while anteriormente, vimos que el ciclo terminaba
cuando una condición particular se cumplía.
Pero si por alguna razón la condicion nunca se cumple, el ciclo continuara para
siempre. Por ejemplo en el siguiente código:
x=0
while [ x -lt 10 ]
do
echo $x
x=$((x+1))
done
En donde en la comparación nos faltó poner meta carácter ($) en la variable x
Pero a veces es útil crear ciclos infinitos controlados por las sentencias del ciclo,
por ejemplo:
while :
do
x=$((x+1)
if [ $x -gt 100 ]; then
break;
fi
done
El operador : (dos puntos) es un comando del sistema que su valor de ejecución
siempre es 0, por lo cual es útil para crear ciclos while infinitos.
Control de flujo
O por ejemplo, para crear un Daemon:
#!/bin/sh
usuario="administrador@servidor.correo.com"
while :
do
if [ `ps -ef | grep "sshd" | grep -v grep | wc -l` -lt 1 ]; then
# el proceso no esta corriendo!!
echo "aguas!!, el proceso sshd ya no corre" > /tmp/procdaemon.$$
mail -s"aguas!!" $usuario < /tmp/procdaemon.$$
rm /tmp/procdaemon.$$
# tratando de levantar nuevamente el proceso
/etc/rc.d/init.d/sshd stop
/etc/rc.d/init.d/sshd start
fi
sleep 300 # 5 minutos
done
14
Secuencia Condicional CASE … ESAC
Sintaxis :
case <variable> in
<valor> ) <comando> ( la variable es = valor , ejecuta los comandos hasta „;;‟ )
<comando>
;;
<valor> ) <comando>
<comando>
;;
* ) <comando> ( Clausula "otherwise" ó "default" : Si no se cumple alguna
<comando> de las anteriores ejecuta los comandos hasta „;;‟ )
;;
esac ( Igual que if acaba en fi , case acaba en esac )
Ejemplos: minimenu.sh
clear # borrar pantalla
echo "1.- Quien hay por ahi ?" # pintar opciones
echo "2.- Cuanto disco queda ?"
echo "3.- Nada. Salir. "
echo "Cual quieres ? : \c" # el carácter "\c" evita que el echo salte nueva línea
read opcion # "opcion" vale lo que se ha tecleado en pantalla
case "$opcion" in # IMPORTANTE : Poner la variable como "$opcion"
15
for j # no tiene error! esta cosa rara permite coger todos los ficheros del
argumento
do
echo "$j ? \c" >/dev/tty
read resp
case $resp in
s*) echo $j ;; # si escribe "s" ó "si"
n*) break ;; # lo mismo esac
done </dev/tty
16
Bucles FOR
Sintaxis :
El bloque entre "for" y "done" da tantas vueltas como elementos existan en <lista>
, tomando la variable cada uno de los elementos de <lista> para cada iteración . En
esto conviene no confundirlo con los for..next existentes en los lenguajes de tipo
algol (pascal , basic ...) que varían
contadores .
En el campo <lista> podemos sustituir la lista por patrones de ficheros para la shell
, la cual
expande dichos patrones por los ficheros correspondientes ; de tal forma que al
escribir
for j in *
la shell cambia el „*‟ por todos los ficheros del directorio actual. Por tanto , el
siguiente programa :
for j in *
do
echo $j
done
17
Equivale al comando „ls‟ sin opciones - merece la pena detenerse un momento para
comprender esto.
Vale también poner en el campo <lista> comillas de ejecución junto con cualquier
comando; la construcción - for j in `cat /etc/passwd` -, por ejemplo, ejecutaría
tantas iteraciones como líneas tuviese dicho fichero, y para cada vuelta, la variable -
j- contendría cada una de las líneas del mismo. Por tanto, valdrían expresiones
como - for j in `who` - para procesar todos los usuarios activos en el sistema , - for j
in `lpstat -o ` - , para procesar todos los listados pendientes , ó - for j in
`ps -e` - para tratar todos los procesos de nuestra sesión.
18
Bucles WHILE
Sintaxis :
while <condición>
do
( ... comandos ... )
Done
Ejemplo :
while [ "$opcion" != "3" ]
do
echo "Meta opcion"
read opcion
done
ó también , utilizando comandos :
echo "Escribe cosas y pulsa ^D para terminar"
while read cosa
do
echo $cosa >> /tmp/borrame
done
echo "Las lineas que has escrito son :"
cat /tmp/borrame
# programa para contar
# llamada : contar.sh <numero>
case $# in
0) echo "Falta argumento"
exit 1
;;
esac
c=0
while [ $c -le $1 ]
do
echo $c
c=`expr $c "+" 1`
done
19
Sintaxis De Las Sentencias De Control
El bash shell soporta un conjunto amplio de sentencias de control estructurado que
nos permiten tomar decisiones o repetir ciertos grupos de comandos con facilidad.
20
IF ... THEN ... FI
Este comando permite bifurcar la ejecución de un shell script en función a un
conjunto de expresiones condicionales. Su sintaxis es la siguiente:
if l1
then
l2
elif l3
then
l4
elif l5
then
l6
…
else
ln
fi
El comando if ejecuta inicialmente la lista de comandos l1. Si el último comando de
esta lista tiene éxito (devuelve el código 0), entonces se ejecuta la lista de
comandos l2. Si el último comando falla se repite el mismo esquema con cada una
de las ramas elif. Si no se ejecuta con éxito la sentencia asociada a ninguna de ellas
entonces se ejecuta la lista de sentencias asociada a la rama else. Tanto las ramas
elif como la rama else son opcionales.
A continuación se muestra un sencillo ejemplo que ilustra el comando if.
$ cat > if.bsh
#!/bin/bash
echo "Teclee un número: "
read num
if (( num > 0 ))
then
echo $num es positivo
elif (( num == 0 ))
echo $num es nulo
else
echo $num es negativo
fi
^D
$ chmod ugo+x if.bsh
$ if.bsh
Teclee un número:
12
21
12 es positivo
$ if.bsh
Teclee un número
1
1
es negativo
En este ejemplo hemos hecho uso por primera vez del comando read que juega un
papel complementario a echo, pues sirve para leer datos desde el terminal.
22
WHILE ... DONE
La sintaxis de este comando es la siguiente:
while l1
do
l2
done
while ejecuta inicialmente la lista de comandos l1 y finaliza si el último comando en
ella falla. En otro caso ejecuta la lista de comandos l2 y a continuación repite el
mismo esquema una y otra vez. En el siguiente ejemplo se desarrolla un programa
que solicita al usuario un número hasta que este está entre 1 y 10.
num=0
while (( num < 1 || num > 10 ))
do
read num
done
23
Estructuras Condicionales y Selectivas
Ambas estructuras de programación se utilizan para escoger un bloque de código
que debe ser ejecutado tras evaluar una determinada condición. En la estructura
condicional se opta entre 2 posibilidades, mientras que en la selectiva pueden
existir un número variable de opciones
Estructuras Condicionales
La estructura condicional sirve para comprobar si se ejecuta un bloque de código
cuando se cumple una cierta condición. Pueden anidarse varias estructuras dentro
de los mismos bloques de código, pero siempre existe una única palabra fi para
cada bloque condicional.
La tabla muestra cómo se representan ambas estructuras en BASH.
24
Véanse algunos sencillos ejemplos de la estructura condicional simple extraídos del
“script” /etc/rc.d/rc.sysinit. Nótese la diferencia en las condiciones sobre la salida
normal de una orden –expresada mediante una sustitución de mandatos– y
aquellas referidas al estado de ejecución de un comando (si la orden se ha
ejecutado correctamente o si se ha producido un error).
25
echo
elif [ "$rc" = "1" ]; then
passed "$STRING"
echo
fi
Estructura Selectiva
La estructura selectiva evalúa la condición de control y, dependiendo del resultado,
ejecuta un bloque de código determinado. La siguiente tabla muestra el formato
genérico de esta estructura.
26
Obsérvense los siguientes ejemplos:
# Según el valor de la variable UTC:
# - si es “yes” o “true”, ...
# - si es “no” o “false”, ...
case "$UTC" in
yes|true) CLOCKFLAGS="$CLOCKFLAGS --utc";
CLOCKDEF="$CLOCKDEF (utc)";
;;
no|false) CLOCKFLAGS="$CLOCKFLAGS --localtime";
CLOCKDEF="$CLOCKDEF (localtime)";
;;
Esac
27
Bucles
Los bucles son estructuras reiterativas que se ejecutan repetitivamente, para no
tener que teclear varias veces un mismo bloque de código. Un bucle debe tener
siempre una condición de salida para evitar errores provocados por bucles infinitos.
La siguiente tabla describe las 2 órdenes especiales que pueden utilizarse para
romper el modo de operación típico de un bucle.
Los siguientes puntos describen los distintos bucles que pueden usarse tanto en un
guión como en la línea de mandatos de BASH.
Bucles Genéricos
Los bucles genéricos de tipos “para cada” ejecutan el bloque de código para cada
valor asignado a la variable usada como índice del bucle o a su expresión de
control. Cada iteración debe realizar una serie de operaciones donde dicho índice
varíe, hasta la llegar a la condición de salida.
El tipo de bucle for más utilizado es aquél que realiza una iteración por cada
palabra (o cadena) de una lista. Si se omite dicha lista de valores, se realiza una
iteración por cada parámetro posicional.
Por otra parte, BASH soporta otro tipo de bucle iterativo genérico similar al usado
en el lenguaje de programación C, usando expresiones aritméticas. El modo de
operación es el siguiente:
· Se evalúa la primera expresión aritmética antes de ejecutar el bucle para dar un
valor inicial al índice.
· Se realiza una comprobación de la segunda expresión aritmética, si ésta es falsa se
ejecutan las iteraciones del bucle. Siempre debe existir una condición de salida
para evitar que el bucle sea infinito.
· como última instrucción del bloque se ejecuta la tercera expresión aritmética –que
debe modificar el valor del índice– y se vuelve al paso anterior.
28
La siguiente tabla describe los formatos de los bucles iterativos genéricos (de tipo
“para cada”) interpretados por BASH.
29
Bucles Condicionales While & Until
Los bucles condicionales evalúan la expresión en cada iteración del bucle y
dependiendo del resultado se vuelve a realizar otra iteración o se sale a la
instrucción siguiente.
La siguiente tabla describe los formatos para los 2 tipos de bucles condicionales
soportados por el intérprete BASH.
30
Bucle de Selección Interactiva
La estructura select no es propiamente dicho un bucle de programación
estructurada, ya que se utiliza para mostrar un menú de selección de opciones y
ejecutar el bloque de código correspondiente a la selección escogida. En caso de
omitir la lista de palabras, el sistema
presenta los parámetros posicionales del programa o función. Este tipo de bucles
no suele utilizarse.
La siguiente tabla describe el formato del bucle interactivo.
31
CONCLUSIONES
32
BIBLIOGRAFÍA
MESOGRAFÍA
33