You are on page 1of 115

apacitacin 2005 KT ngeniera Electrnica SRL

rogramacin de
rogramacin de
8hell 8cripts
8hell 8cripts
apacitacin 2005 KT ngeniera Electrnica SRL
2
ontenido:
+ Mdulo 0 Generalidades
+ Mdulo 1 !ntroduccin
+ Mdulo 2 Caracteres especiales y Quoting
+ Mdulo 3 variables
+ Mdulo 4 Operadores
+ Mdulo 5 Construcciones condicionales
+ Mdulo 6 Construcciones iterativas o de repeticin
+ Mdulo 7 Funciones
+ Mdulo S Entrada y Salida Redireccin
+ Mdulo 9 Herramientas Niscelaneas
+ Mdulo 10 Filtros
+ Mdulo 11 Lenguaje wk
+ Mdulo 12 Lenguaje sed
+ Mdulo 13 - Depuracin de scritps. Ejercitacin
+ Mdulo 14 Conclusiones
Agenda {mdulos)
apacitacin 2005 KT ngeniera Electrnica SRL
3
Mdulo 0
Generalidades
apacitacin 2005 KT ngeniera Electrnica SRL
4
- Shell
!ntrprete de comandos
Lenguaje de programacin

- Entorno de trabajo
- Case sensitive
- Si un programa no esta en el PATH: .fnombre_programa
- Prompts:
$: usuario normal
#: usuario administrador o superusuario (root)

- omandos sintxis: comndo opciones rgumentos


- Ubicaciones
/bin: comandos estandar para todos los usuarios (ls, ct, cp, mv)
/sbin: comandos estandar para root (shutdown, mkfs)
/usr/bin: comandos para todos los usuarios no presentes en todo sistema UN!X
/usr/sbin: comandos para root no presentes en todo sistema UN!X

- Scripts
- Lista de comandos UN!X reunidos en un archivo. Reutilizacin de cdigo
- Un script es un nuevo comando
Filosofia UN!X crear comandos complejos a partir de comandos simples"

Generalidades
apacitacin 2005 KT ngeniera Electrnica SRL
6
- El shell es independiente del S.O. generacin de docenas de shells
- Bourne shell (Steven Bourne, UN!X version 7, 1979), conocido como sh
- Principal alternativa a sh fue el shell (Bill Joy, BSD, 1981), csh
- Turbo shell, tcsh, superconjunto de csh con mejoras respecto a
amigabilidad y velocidad
- Korn shell (David Korn, AT8T, 1986), ksh, comercial, {ksh) > {sh) U {csh)
- Una alternativa sin costo es la versin de Korn shell conocida como pdksh
(Public Domain Korn shell). pdksh esta disponible como cdigo fuente
- Bourne Again shell (Brian Fox, Chet Ramey, 19881993), bash
- Creado para su uso en el proyecto GNU (Richard Stallman, FSF), no comercial
- Se convirt rapidamente en el derivado de Bourne Shell mas popular
- Shell estandar utilizado ampliamente en los sistemas UN!X e incluido en Linux
- {bash) > {csh) U {ksh)
- !ntuitivo y flexible
- Z shell, zsh, (Paul Falstad, Princeton, aprox. 1990) posee similitudes con ksh
{zsh) > {bash) U {ksh) U {tcsh)
Historia de los shell de UNIX
apacitacin 2005 KT ngeniera Electrnica SRL
7
Mdulo 1
!ntroduccin
apacitacin 2005 KT ngeniera Electrnica SRL
8
{Bourne Shell} < {Bourne shell Again} > { Shell} U {Korn Shell}
- aractersticas propias de -shell incorporadas:
- Nanipulacin de directorios.
- Control de trabajos.
- Expansin de llaves, para la generacin de cadenas arbitrarias.
- Caracter tilde (~), manera de referenciar al directorio home.
- Alias, que permiten referenciar mas convenientemente comandos y sus opciones.
- Histrico de comandos, que posibilita reutilizar comandos previamente tipeados.
- aractersticas propias:
- Edicin de linea de comandos, permite usar comandos al estilo vi o emacs.
- Configuracin de teclas (key bindings) permiten establecer secuencias de teclas de
edicin personalizadas .
- Caracteristicas de programacin integrada: la funcionalidad de comandos UN!X (test,
expr, getopt, echo) se integraron en el shell, permitiendo que tareas comunes de
programacin sean realizadas mas clara y eficientemente.
- Estructuras de control, especialmente el select para la generacin sencilla de menus.
- Opciones y variables nuevas permiten personilizar mas el entorno.
- Arrays unidimensionales que permiten facil acceso a lista de datos.
aractersticas de bash
apacitacin 2005 KT ngeniera Electrnica SRL
0
!/bin/bash
Primer script
echo Hola Mundo
$./hol.sh
Hola Mundo
Primer ejemplo

hol.sh
quien interpretara
el resto de los
comandos
comentario comando
jecucin:
apacitacin 2005 KT ngeniera Electrnica SRL

Lee la entrada desde un archivo, como un argumento o desde la
terminal
Divide la entrada en tokens de acuerdo a las reglas de quoting.
Se hacen expansiones de metacaracteres y alias
Se analizan los tokens y se dividen en comandos simples y
compuestos
Se hacen expansiones separando los tokens expandidos en listas de
nombres de archivo y comandos con sus argumentos
Se realizan redireccionamientos, eliminando operadores y
operandos de redireccin
Se ejecuta el comando
Opcionalmente se espera la finalizacin del mismo para recoger su
exit status
mo ejecuta un comando en shell?
apacitacin 2005 KT ngeniera Electrnica SRL
2
Archivos de configuracin de bash {1J5)
- Existen, eventualmente, tres archivos en el directorio home
.bsh_profile
.bshrc
.bsh_logout

- Se utilizan para definir variables yJo ejecutar comandos al ingresar
al sistema, cuando se invoca un nuevo shell o al cerrar la sesin
- Pueden existir o no dependiendo de como se creo la cuenta de
usuario.
Si no existen, el usuario utilizar slo el archivo de sistema
/etc/profile, o puede optar por editarlos l mismo
- El ms importante es .bsh_profile, el cual es leido por el shell
para ejecutar los comandos que contiene cada vez que se ingresa al
sistema
apacitacin 2005 KT ngeniera Electrnica SRL
4
Archivos de configuracin de bash {2J5)
- Algunas lneas de .bsh_profile
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/locl/bin
SHELL=/bin/bsh
MANPATH=/usr/mn:/usr/X11/mn
EDITOR=/usr/bin/vi
PS1='\h:\w\$ '
PS2='> '
set -o ignoreeof
export EDITOR
- Si se agregan nuevas lneas no sern consideradas hasta que el
archivo .bsh_profile sea ledoJejecutado nuevamente,
reingresando al sistema, por ejemplo
- omando source: Ejecuta los comandos en el archivo especificado
$ source .bsh_profile
- Alternativa para source comando, utilizar el comando punto {.)
$ ./bsh_profile
apacitacin 2005 KT ngeniera Electrnica SRL
5
Archivos de configuracin de bash {3J5)
- bash admite dos sinnimos para .bsh_profile:
-.bsh_login, derivado del archivo .login de shell
-.profile, derivado del archivo .profile del Bourne shell y el Korn
shell
- Se lee slo uno de estos al ingresar al sistema
- Orden: .bsh_profile .bsh_login .profile
- .bshrc puede o no existir
- Al iniciar un nuevo shell (un subshell) se leern los comandos de
.bshrc
- eparacin de comandos de inicio y de personalizacin de shell
Si .bshrc no existe entonces no se ejecutarn cuando se inicia un
subshell
apacitacin 2005 KT ngeniera Electrnica SRL
6
Archivos de configuracin de bash {4J5)
# If running interctively, then:
if [ "$PS1" ]; then
# don't put duplicte lines in the history.
# export HISTCONTROL=ignoredups
# enble color support of ls nd lso dd hndy lises
evl `dircolors -b`
lis ls='ls --color=uto
# some more ls lises
#lis ll='ls -l'
#lis l='ls -A'
#lis l='ls -CF'
# set fncy prompt
PS1='\u@\h:\w\$ '
# If this is n xterm set the title to user@host:dir
#cse $TERM in
#xterm*)
# PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"
# ;;
#*)
# ;;
#esc
fi
apacitacin 2005 KT ngeniera Electrnica SRL
8
Archivos de configuracin de bash {5J5)
- .bsh_logout es ledo y ejecutado cada vez que se sale del

- Brinda la capacidad de ejecutar comandos, como eliminar archivos
temporarios
- Generalmente hay que definirlo mediante edicin manual
- Si no existe, no se ejecutarn comandos extra a la salida
apacitacin 2005 KT ngeniera Electrnica SRL
9
- A veces la sintaxis de los comandos es difcil de recordar,
especialmente si se utilizan con varias opciones y argumentos
- Alias = sinnomo enriquecido
- Los alias pueden definirse en lnea de comandos, en el
.bsh_profile, o en .bshrc, mediante:
lis [nme=commnd] JJ sin espacios entre el signo =
- Ejemplos: $ alias lf='ls -F'
$ alias revsort='ls [0-9]* | sort -v'
.
- Notas:
- Se permite definir un alias de un alias
- No estn permitidos los alias recursivos $ alias ls='ls -la'
- Los alias slo pueden usarse al principio de un comando {existen
excepciones)
$ alias pkgs=/var/sadm/pkg
$ alias cd='cd '
.
- Implicancias
Brevedad (ls=ls -lha) Costumbre (dir=ls)
Proteccin (rm=rm -i) Personalizacin (moer=more)
Alias
apacitacin 2005 KT ngeniera Electrnica SRL
20
- Los alias permiten definir nombres convenientes para los comandos
pero no cambian realmente el comportamiento del shell
- Una opcin de shell se establece como activaJinactiva {onJoff) y
cambia efectivamente el comportamiento del shell
- Sintaxis bsica {contraintuitiva)
set +o opcion off
set -o opcion on

- Para visualizar el estado de las opciones set -o

- La mayora de los nombres de opciones tienen asociado una letra
para abreviarlas, set -o noglob set -f

- Ejemplos: {en on)
ignoreeof Deshabilita Ctrl-d para salir de la sesin; debe usarse exit
noclobber Deshabilita la redireccin de salida (>) sobre archivos existentes
noglob Deshabilita la expansin de metacaracteres como * y ?
notify Reporta el estado de terminacin de los jobs de inmediato
nounset !ndica un error cuando se intenta utilizar variables no definidas
vi Entra al modo edicin de vi directamente
Opciones
apacitacin 2005 KT ngeniera Electrnica SRL
22
Mdulo 2
Caracteres especiales
y Quoting
apacitacin 2005 KT ngeniera Electrnica SRL
23
- onocidos tambin como metacaractes
- Los metacaracteres poseen significado especial para el shell
- Existen diversas categoras de acuerdo a la funcionalidad con que
estn relacionados
- Ejemplos:
$ cd ~/libros
$ rm *.bck
$ find / -name a* & Bsqueda prolongada
$ echo El dijo \Hola\
$ echo Fecha y hora actual: `date`
$ echo Hay `wc -l /etc/passwd | awk '{print $1}'` usuarios
aracteres especiales
apacitacin 2005 KT ngeniera Electrnica SRL
24
Crcter Significdo
~ Directorio home
` Sustitucin de comndo
# Comentrio
$ Vlor de vrible
& Trbjo en bckground
* Estrell de Kleene (expresiones regulres)
( Inicio de subshell
) Fin de subshell
\ Crcter de Escpe
| Pipe
[ Inicio de conjunto de crcteres (expresiones regulres)
] Fin de conjunto de crcteres (expresiones regulres)
{ Inicio de bloque de comndos
} Fin de bloque de comndos
; Secuencilizr comndos
' Comill simple (Strong quote)
" Comills dobles (Wek quote)
< Redireccin entrd
> Redireccin slid
/ Seprdor de directorios en pthnme
? Reemplzo de un crcter (expresiones regulres)
! Negcin de pipeline
aractes especiales
apacitacin 2005 KT ngeniera Electrnica SRL
26
- Los archivos ocultos comienzan con punto {.), utilizar ls - (:all)
- omodines
? un caracter cualquiera
* cualquier cadena de caracteres
[...] cualquier caracter entre los corchetes (conjunto)
[!...] cualquier caracter no perteneciente al conjunto
- onjuntos
[bc] , b o c
[.,;] punto, coma y punto y coma
[-c] , b o c
[-z] Todas las minusculas
[!0-9] Ningun digito
[0-9!] Todos los digitos y el caracter !
[-zA-Z] Todas las letras minusculas y mayusculas
- Expansin de llaves {brace expansion)
prefijo{cdens}sufijo
$ echo c{p,r,s}s
capas caras casas
Archivos, comodines y pathname expansion
apacitacin 2005 KT ngeniera Electrnica SRL
27
- La teclas de control {CTRL-letr) son otro tipo de metacaracter
- Normalmente no imprimen nada
- RETURN = CTRL-m
BACKSPACE = CTRL-h
- Pueden diferir de sistema en sistema
Control Key Descripcin
CTRL-C Detiene el comndo ctul (envi SIGINT)
CTRL-D Fin de entrd (eof)
CTRL-\ Detiene el comndo ctul
(si no funcion CTRL-C, envi SIGQUIT)
CTRL-S Detiene slid por pntll
CTRL-Q Reinici slid por pntll
DEL or CTRL-? Borr ltimo crcter
CTRL-W Borr l ltim plbr de l lne de comndos
CTRL-U Borr l line de comndos enter
CTRL-Z Suspende el proceso ctul
CTRL-A Cursor l principio de l lne de comndos
CTRL-E Cursor l finl de l lne de comndos
CTRL-R Bsqued recursiv de comndos
ontrol keys
apacitacin 2005 KT ngeniera Electrnica SRL
28
- Deshabilitar el comportamiento por defecto o imprime textualmente
un metacaracter
- Proteger metacaracteres dentro de una cadena a fin de evitar que se
reinterpreten o expandan por accin del shell
- Ejemplos:
$ echo 2 * 3 > 1 es cierto
No produce salida, que pas?
$ echo El vlor de este producto es $120
El valor de este producto es 20
Por que sale 20 y no 120?
$ ls [A]+
-rw-r--r-- 1 admin admin 1250 Apr 2 15:05 Apendice.txt
-rwxrw-rw- 1 admin admin 804 May 5 18:09 append.c
-rwxrw-rw- 1 admin admin 539 May 9 20:58 a.out
- Existen tres mecanismos de quoting
- El caracter de escape \ (escape character)
- Comillas dobles " (double quotes)
- Comillas simples ' (single quotes)
Quoting
apacitacin 2005 KT ngeniera Electrnica SRL
30
- Es el carcter \ {backslash)
- Evita que el siguiente carcter sea interpretado por el shell
$ echo $1234
234
$ echo \$1234
$1234
- Excepcin: \newline, esta secuencia se interpreta como
continuacin de lnea eliminando posteriormente esta secuencia de
la entrada del comando
- Ejemplo:
$ echo Texto escrito en \
> ms de un line
Texto escrito en mas de una linea
El carcter de escape
apacitacin 2005 KT ngeniera Electrnica SRL
3
- Los caracteres encerrados entre comillas dobles preservan su valor
literal
- Tambin se conoce como Weak quoting o Partial quoting
- Los caracteres * y @ tienen un significado especial cuando se
encierran con comillas dobles
- Excepciones:
$ y ' siguen manteniendo sus significados especiales
\ sigue manteniendo su significado especial slo si antecede los caracteres
$, ', , \ o newline.
- Ejemplos:
$ echo El reloj tiene un vlor de $123
El reloj tiene un precio de 23
$ echo El reloj tiene un vlor de \$123
El reloj tiene un precio de $123
$ echo Es un vino con buen 'bouquet'
Es un vino con buen 'bouquet'
omillas dobles
apacitacin 2005 KT ngeniera Electrnica SRL
32
- Los caracteres encerrados entre comillas simples preservan su valor
literal
- No se permite la desreferencia de variables entre comillas simples
- No puede aparecer una comilla simple entre dos comillas simples
- Tambin se conoce como Strong quoting o Full quoting
- Excepcin: \newline
- Ejemplos:
$ VAR=10
$ echo '$VAR'
$VAR
$ echo 'd* = el crcter <d> seguido de culquier cden, \
inclusive l vc'
$ echo 'L comill simple (') tmin es llmdo opostrofo'
omillas simples
apacitacin 2005 KT ngeniera Electrnica SRL
34
- Las cadenas de la forma $'texto' son consideradas de manera
especial
La cadena se expande a texto con los caracteres de escape \
reemplazados como lo especifica el estndar ANSI-
\ alerta (alerta)
\b retroceso (backspace)
\n nueva lnea (new line)
\t tab horizontal (horizontal tab)
\v tab vertical (vertical tab)
\\ barra invertida (backslash)
- Ejemplos:
$ echo Brr invertid = $'\\'
Barra invertida = \

$ echo Se oye .... $'\'
Se oye .... (beep)

$ echo Hol $'\n' Mundo
Hola
Mundo
ANSI- Quoting
apacitacin 2005 KT ngeniera Electrnica SRL
35
$ echo <-$1250.**>; (updte?) [y|n]
$ echo \<-\$1250.\*\*\>\; \(update\?\) \[y\|n\]
$ echo '<-$1250.**>; (update?) [y|n]'
$ echo L vrible '$UID' contiene el vlor --\> "$UID"
La variable $UID contiene el valor --> 1002
$ echo It's <prty> time!
Se solicita ms entrada
Ejemplos combinados
apacitacin 2005 KT ngeniera Electrnica SRL
36
Mdulo 3
variables
apacitacin 2005 KT ngeniera Electrnica SRL
37
- El uso de variables permite crear scripts flexibles y depurables
- Una variable tiene un nombre y un valor {$nombre)
- Para permitir concatenacin ${vrible}cden
- Bash es case sensitive
- Bash es un lenguaje NO fuertemente tipado
- on el shell se pueden crear, asignar y borrar variables
- reacin $ var1=10 # sin espcios!
- Asignacin $ var2=$var1
- Borrado $ unset var1
- El nombre de una variable puede contener slo letras {a-z o A-Z),
nmeros {0-9) o guin bajo {_) y comenzar con una letra o _
- Las variables con nombres "numricos" estn reservadas
- Ejemplos:
CantPersonas cantpersonas CANTPERSONAS
_Nueva_Variable_ producto_120 esta-mal?
1 10mil _________
- Preguntas: $ var3 = 33
$ $var2=50
$ 3=400
Introduccin {1J2)
apacitacin 2005 KT ngeniera Electrnica SRL
38
- No se advierten sobreescrituras
- Es posible almacenar en una variable el resultado de la ejecucin de
un comando.
- on acentos graves
$ lista_de_archivos=`ls`
- on $(...): anidable
$ lista_de_archivos=$(ls)
$ lista_de_archivos=$(ls $(cat directorios.txt))
- Referencia indirecta: Si el valor de una variable es el nombre de una
segunda podemos recuperar el valor de la segunda a travs la
primera
$ dosmil=numero
$ numero=2000
$ echo $dosmil #Referenci direct
numero
$ evl echo \$$dosmil #Referenci indirect
2000
Introduccin {2J2)
apacitacin 2005 KT ngeniera Electrnica SRL
39
- Variables Locales
- Presentes en la instancia actual del shell
- No disponibles para programas iniciados desde el shell {no
exportadas)
- Variables de Entorno
- Disponibles por todo proceso hijo del shell
- Muy tiles para la escritura de scripts y programas
- Pueden visualizarse mediante el comando env
- Se pueden agregar variables al entorno mediante export
- Nombres en maysculas por convencin
- Variables de Shell
- Establecidas y utilizadas por el shell para su funcionamiento
- Algunas son variables de entorno otras son locales
- Pueden visualizarse mediante el comando set
- onvencionalmente tienen nombres en maysculas
PWD UID SHLVL
PATH HOME IFS (Internal Field Separator)
Variables de shell y entorno
apacitacin 2005 KT ngeniera Electrnica SRL
40
- Son aquellas variables cuyos nombres son nmeros
- Estas referencian a los argumentos de los comandos
$ find / -nme progrm.c
*
Nombre comando = find $0
1er argumento = f $1
2do argumento = -nme $2
3er argumento = progrm.c $3
Nas argumentos $4, $5, ..., ${10}, ${11}
- Observaciones:
- bsenme $0: nombre del comando
- dirnme $0: path al nombre del comando
- shift: rota los argumentos hacia la izquierda $i${i+1}, $0 no cmbi
Puede tomar un nmero n como argumento, as los parmetros
n+1...$# se renombran a 1..$#-(n+1)
Parmetros posicionales o argumentos {1J2)
apacitacin 2005 KT ngeniera Electrnica SRL
42
- Variables argumento especiales
$#: cantidad de argumentos pasados al comando
$*: todos los argumentos $*=$1 $2 $3..., una sola palabra
formada por los parmetros separados por el 1er carcter en IFS
$@: todos los argumentos $@=$1 $2 $3..., separadas por ' '
$_: comando previo
$-: flags pasadas al script
$$: pid del proceso shell
$!: pid del ltimo trabajo ejecutndose en background
$?: exit sttus
- $* y $@ difieren slo cuando estan encerradas entre comillas dobles
*
- Nota: Estas variables son read-only
- El comando redonly establece como read-only a las variables
- Ejemplo:
$ FRUTA=kiwi
$ redonly FRUTA
$ echo $FRUTA
kiwi
$ FRUTA=durazno # Produce error
Parmetros posicionales o argumentos {2J2)
apacitacin 2005 KT ngeniera Electrnica SRL
43
- Las variables enteras en Bash son enteros con signo {32 bits)
- Posibilidad de overflow
- Bash por s mismo no comprende la aritmtica de punto flotante
- Bash considera a los nmeros conteniendo punto decimal como
cadenas
- Utilizar el lenguaje bc en los scripts si es necesario realizar clculos
de punto flotante o emplear funciones matemticas de bibliotecas
- Ejemplos:
$ echo "2.35 + 56.90" | bc 59.25
$ echo "sqrt(2)" | bc 1
$ echo "sqrt(2.0)" | bc 1.4
$ echo "sqrt(2.00000000)" | bc 1.41421356
- Nota: Veremos posteriormente ms capacidades de bc
Variables enteras
apacitacin 2005 KT ngeniera Electrnica SRL
44
- Un array es una serie de casillas, cada una conteniendo un valor
- asilla = elemento, los elementos se acceden mediante ndices
- Los ndices comienzan en 0 hasta ms de 5 mil billones
- En bash son nicamente uni-direccionales
- Asignaciones:
$ colores[0]=rojo
$ colores[2]=verde
$ colores[1]=amarillo
$ colores=([2]=verde [0]=rojo [1]=amarillo)
$ colores=(rojo amarillo verde)
$ colores=(rojo [10]=amarillo verde)
- Los arrays se pueden declarar vacos explicitament mediante
$ declare -a colores
- Los atributos establecidos para el array {read-only) se aplican a
todos los elementos
- Para referenciar un elemento: ${array[i]}
$ echo 'No pasar' es ${colores[0]}
- Para referenciar todos los elementos ${name[*]} o ${name[@]}
$ echo ${colores[*]}
Arrays
apacitacin 2005 KT ngeniera Electrnica SRL
47
- El comando set despliega las variables de shell junto a sus valores
- Permite definir el comportamiento del bash {opciones)
- Sintaxis:
set [-bdefhkmntuvxBCHP] [(-|+)o opcion] [rgumento...]
-n Lee comandos pero no los ejecuta, util para depurar sintacticamente scritps
-v Nuestra las lineas de entrada del shell tal cual son leidas
-x Nuestra una traza de un comando y sus argumentos luego de aplicar expansiones
- Su uso habitual en shell scripts es para establecer los parmetros
posicionales
$ set `dte`
$ echo Hor ctul: $4
Hora actual: 08:40:25
omando set
apacitacin 2005 KT ngeniera Electrnica SRL
48
- bash provee getopts para tratar con opciones mltiples y complejas
- puede utilizarse como una condicin en un bucle while, dada la
especificacin del formato de opciones {validez y argumentos), en
el cuerpo del while se procesan
- Sintaxis:
getopts cden vrible
- cden conteniendo letras {opciones) y :'s {argumentos)
- vrible que almacena el argumento de la opcin que est analizndose
- Ejemplo:
while getopts ":b:c" opt; do
case $opt in
a ) procesar la opcin -a ;;
b ) procesar la opcin -b
$OPTARG es el argumento de la opcin ;;
c ) procesar la opcin -c ;;
\? ) echo 'usage: alice [-a] [-b barg] [-c] args...'
exit 1
esac
done
omando getopts
apacitacin 2005 KT ngeniera Electrnica SRL
50
Mdulo 4
Operadores
apacitacin 2005 KT ngeniera Electrnica SRL
5
- Evala una expresin condicional
$ test opcion expresion
- test retorna un 0 {true) o un 1 {flse) luego de la evaluacin
- Una manera ms concisa es mediante [...]
$ [ opcion expresion ]
- Ejemplos:
$ test 1 -gt 2
$ [ 1 -gt 2 ] # espacios obligatorios [_ y _]
- bash introdujo el comando extendido de test, [[...]], con un
comportamiento ms familiar para los programadores
$ [ -f /etc/passwd && -f /etc/group ] # no aceptado
$ [[ -f /etc/passwd && -f /etc/group ]] # ok
- Las construcciones ((...)) y let... evalan expresiones
aritmticas y retornan 0 {true) si el resultado es distinto de cero
y 1 {flse) en caso contrario
$ ((1 > 2))
$ let 1 > 2
El comando test
apacitacin 2005 KT ngeniera Electrnica SRL
52
true y flse
- TRUE
- true: comando que retorna siempre un exit sttus exitoso {cero)
sin hacer nada
$ true
$ echo $?
0
- Tambin evalan a true: 0, 1, -1, "abc".
- FALSE
- flse: comando que retorna siempre un exit sttus no exitoso
{distinto de cero) sin hacer nada
$ flse
$ echo $?
1
- Tambin evalan a false: NULL, variable no inicializada, variable
nula.
apacitacin 2005 KT ngeniera Electrnica SRL
54
Asignacin y Operadores aritmticos
- variable=asignacion
Inicializa o cambia el valor de una variable
Funciona tanto para enteros como para cadenas
- Advertencia: No confundir con el operador de comparacin =
$ var=27
$ animal=tigre # Sin espacios entre el signo =
- Operadores aritmticos
+ sum
- rest
* producto
/ cociente
** exponencicin
% mdulo o mod
+= ms-igul
-= menos-igul
*= por-igul
/= dividido-igul
%= mdulo-igul
apacitacin 2005 KT ngeniera Electrnica SRL
55
Operadores de bits

<< left shift (multiplic por 2)


<<= left-shift-igul
$ let "var <<= 2" como un producto de 2^n
>> right shift (divide por 2)
>>= right-shift-igul (inverso de <<=)
$ let "var >>= 3" como una divisin de 2^n

& nd
&= nd-igul
| or
|= or-igul
~ negcin
! negcin
^ xor (o-exclusivo)
^= xor-igul

$ var1=24 00000000 00000000 00000000 00011000


$ var2=10 00000000 00000000 00000000 00001010
$ let "var1 &= var2"
$ echo $var1
8
apacitacin 2005 KT ngeniera Electrnica SRL
56
Operadores de comparacin de enteros
JCL
-eq es igul [ "$" -eq "$b" ] EQ
-ne es distinto [ "$" -ne "$b" ] NE
.
-gt es myor que [ "$" -gt "$b" ] GT
> es myor que (("$" > "$b"))
-ge es myor o igul que [ "$" -ge "$b" ] GE
>= es myor o igul que (("$" >= "$b"))
.
-lt es menor que [ "$" -lt "$b" ] LT
< es menor que (("$" < "$b"))
-le es menor o igul que [ "$" -le "$b" ] LE
<= es menor o igul que (("$" <= "$b"))
- Ejemplos:
$ vr1=21; vr2=22
$ (("$vr1" <= "$vr2"))
$ echo $?
0
$ [ "$vr1" -le "$vr2" ]
$ echo $?
0
$ (("$vr1" > "$vr2"))
$ echo $?
1
apacitacin 2005 KT ngeniera Electrnica SRL
58
Operadores de comparacin de cadenas
= es igul [ "$" = "$b" ]
== es igul [ "$" == "$b" ]
!= es distinto [ "$" != "$b" ]
< es menor en orden lexicogrfico
[[ "$" < "$b" ]]
[ "$" \< "$b" ]
> es mayor en orden lexicogrfico
[[ "$" > "$b" ]]
[ "$" \> "$b" ]
- Nota: "<" y ">" necesitan ser escapados dentro de []
${#vr} retorna la longitud del valor de vr
expr length $vr idem
expr "$vr" : '.*' idem
-z la cadena es "null" {tiene longitud 0)
-n la cadena no es "null"
- Nota: veremos detalles del comando expr ms adelante
apacitacin 2005 KT ngeniera Electrnica SRL
59
ondiciones sobre archivos
-e existe el rchivo
-f es un rchivo regulr
-r tiene permiso de lectur
-w tiene permiso de escritur
-x tiene permiso de ejecucin
-s no tiene cero bytes (no es vco)
-d es un directorio
-b es un block device (floppy, cdrom)
-c es un chrcter device (keybord, modem, sound crd)
-p es un pipe nomindo (FIFO)
-h es un hrd link
-L es un symbolic link
-S es un socket
-O soy el propietrio del rchivo?
-G el GID del rchivo es igul l mo?
-N se modific desde su ltim lectur?
fl -nt f2 es ms nuevo que z, en relacion a la actualizacion
fl -ot f2 es ms viejo que z, en relacion a la actualizacion
fl -ef f2 y z son hrd links l mismo rchivo
! "no" o negcin (invierte el sentido del test, retorn
true si l condicn no est presente)
apacitacin 2005 KT ngeniera Electrnica SRL
60
Operadores lgicos
- negacin !expr
- and lgico expr1 && expr2
- or lgico expr1 || expr2
- asociatividad ( expr ) utilizado para forzar evaluacin
- Ejemplos:
$ echo -n Hol && echo Mundo
Hola Mundo
$ flse && echo Mundo
(nada, evala a 1)
$ true && echo Mundo
Mundo
$ echo -n Hol || echo Mundo
Hola
$ flse || echo Mundo
Mundo
$ true || echo Mundo
(nada, evalua a 0)
apacitacin 2005 KT ngeniera Electrnica SRL
6
Operadores miscelneos
- Operador coma
- Permite encadenar dos o ms operaciones aritmtica

- Se evala cada operacin {con posibles efectos laterales), pero slo
se retorna la ltima operacin

- Similar al operador coma de
- Ejemplos:
$ let "t1 = ((5 + 3, 7 - 1, 15 - 4))"
$ echo "t1 = $t1"
t1 = 11
$ let "t2 = ((i = 9, 15 / 3))" se establece i (efecto lateral)
$ echo "t2 = $t2 i = $i"
t2 = 5 i = 9
apacitacin 2005 KT ngeniera Electrnica SRL
62
Mdulo 5
Construcciones
condicionales
apacitacin 2005 KT ngeniera Electrnica SRL
63
- Sintaxis:
if condicin1 ;
then
comndos1
elif condicin2 ; # / \
then # | |
comndos2 # | Esto es opcionl |
else # | |
comndos3 # \ /
fi
- Realiza acciones {ejecuta comandos) dependiendo del valor de
verdad de una condicin {un comando)
- elif es una abreviatura de elseif
- Las condiciones evaluan valores de variables, caractersticas de
archivos, si un comando se ejecuta o no correctamente, etc
- Ejecucin:
1. Se evala condicin1
2. Si su exit code es 0, se ejecutan los comndos1 y termina el if
3. De otra manera se evala condicin2
4. Si su exit code es 0, se ejecutan los comndos2 y termina el if
5. En caso contrario se ejecutan los comndos3 y termina el if
Sentencia if {1J3)
apacitacin 2005 KT ngeniera Electrnica SRL
64
- Errores comunes:
- Omitir el punto y coma {;) antes de la sentencia then al escribir el
if de manera lineal
if condicion; then comndos1 else comndos2 fi

- Utilizar elseif en lugar de elif
- Omitir la sentencia the then cuando se utiliza la sentencia elif
- Escribir if en lugar de fi al cerrar el cuerpo del if

- Ejemplos:
if grep sldo clientes > /dev/null grep -qs saldo clientes
then
echo "clientes contiene al menos una ocurrencia de sldo."
elif grep deud clientes > /dev/null
echo "clientes contiene al menos una ocurrencia de deud."
else
echo "Las palabras sldo y deud no estan presentes en clientes"
fi
Sentencia if {2J3)
apacitacin 2005 KT ngeniera Electrnica SRL
66
- Ejemplos:
!/bin/bash
xusers=`who | wc -l`
if [ $xusers -gt 1 ] ;
then
echo "Hay ms de un usuario conectado"
else
echo "Slo Ud. est conectado"
fi
var1=21
var2=22
[ "$var1" -ne "$var2" ] && echo "$var1 no es igual a $var2"
# El lo mismo que
if [ "$var1" -ne "$var2" ] ;
then
echo "$var1 no es igual a $var2"
fi
# Y esto que es igul?
[ "$var1" -ne "$var2" ] || echo "$var1 no es igual a $var2"
Sentencia if {3J3)
apacitacin 2005 KT ngeniera Electrnica SRL
67
- Sintaxis:
cse plbr in
ptronl)comndos1 ;;
ptron2)comndos2 ;;
.... el patron *) es (opcional) y se utiliza como default
esc
- plbr es comparada frente a cada ptron hasta que se encuentre
una coincidencia o estos se acaben
- se ejecutan slo los comndos asociados con el ptron coincidente
en caso que est presente el ;; y luego se sale del cse, en caso
contrario se ejecutarn los comndos del ptron inferior, etc...
- Los ;; hacen las veces del break de
- Un ptron es una cadena consistente en caracteres comunes y
metacaracteres
- No existe lmite para la cantidad mxima de patrones aunque el
mnimo es uno
- cse sirve para simplificar construcciones tipo if/elif/.../elif/fi
- Su verdadero poder radica en el uso de patrones
Sentencia cse {1J2)
apacitacin 2005 KT ngeniera Electrnica SRL
68
- Ejemplo:
if [ "$fruta" = banana ] ; then
echo "La banana es rica en potasio."
elif [ "$fruta" = kiwi ] ; then
echo "El kiwi provee vitamina C."
elif [ "$fruta" = manzana ] ; then
echo "La manzana es baja en caloras."
fi
# Con cse
case $fruta in
bnn) echo "La banana es rica en potasio." ;;
kiwi) echo "El kiwi provee vitamina C." ;;
mnzn) echo "La manzana es baja en caloras." ;;
esac
# Otro ejemplo
case $archivo in
*.conf) echo "$archivo es un archivo de configuracion" ;;
*.gz|*.bz2) echo "$archivo es un archivo comprimido" ;;
*.[gif|jpg]) echo "$archivo es un archivo de imagen" ;;
*) echo "$archivo es un archivo no clasificado" ;;
esac
Sentencia cse {2J2)
apacitacin 2005 KT ngeniera Electrnica SRL
70
Mdulo 6
Construcciones iterativas
o de repeticin
apacitacin 2005 KT ngeniera Electrnica SRL
7
- Es la construccin de iteracin bsica
- Sintaxis:
for rg in list ;
do
comndo(s)...
done
- En cJiteracin rg toma valores de list y se ejecutan comndo(s)...
- list puede contener metacaracteres for i in hoj*
- Los elementos en list pueden tener argumentos
- Si do est en la misma lnea que for es necesario el punto y coma
- Ejemplos:
for planeta in Mercurio Venus Tierra Marte ;
do
echo $planeta
done
for file in /vr/*.bck ;
do
rm $file
done
Sentencia for
apacitacin 2005 KT ngeniera Electrnica SRL
72
- Sintaxis:
select nme [in list]; los [] estn indicando opcin
do no es parte de la sintaxis
comndo(s)...
done
- Provee una manera simple de crear mens numerados para que los
usuarios seleccionen una de las opciones en list
- Introducido por ksh posteriormente incorporado por bsh
- Ejecucin:
1. Se muestra cada elemento de list acompaado de un nmero
2. Se muestra el prompt PS3, generalmente es #?
3. uando el usuario ingresa un valor se almacena en $REPLY
4. Si $REPLY contiene un nmero vlido, nme se establece a la variable
asociada a dicho nmero.
Si $REPLY contiene un nmero NO vlido, nme ser nula.
Si se ingresa una lnea vaca se muestra list y el prompt nuevamente.
En caso de EOF, se finaliza el select.
5. Se ejecutan los comndo(s)... en los primeros dos casos.
6. Si no se utiliza ningn mecanismo de control de bucles se contina con
el paso 1
Sentencia select {1J2)
apacitacin 2005 KT ngeniera Electrnica SRL
74
- Ejemplo:
!/bin/bash
PS3='Elija su comida favorita: ' Establece el prompt
echo
select food in "Asdo" "Lsgn" "Pell" "Pizz"
do
[ -e "$food" ] && continue
echo "Su comida favorita es $food."
brek
done
exit 0
- Nota: Si se omite list, select utilizar los argumentos pasados al
script {$@), o a la funcin que contiene el select
- Nota: Ms adelante, en este mismo mdulo veremos el significado
de break y continue
Sentencia select {2J2)
apacitacin 2005 KT ngeniera Electrnica SRL
76
- Sintaxis:
while comndo ; comndo condicin comando test
do
comndo(s)...
done
- Se ejecuta mientras que la condicin sea verdadera
- Para repetir comndo(s)... un nmero de veces no preestablecido
- Ejecucin:
1. Se ejecuta comndo
2. Si el exit sttus de comndo es distinto de cero, finaliza el while
3. Si el exit sttus de comndo es cero, se ejecuta comndo(s)...
4. uando finaliza comndo(s)... se retorna al paso 1
- Sintaxis in-line: while comndo ; do comndo(s)... ; done
- Ejemplo:
x=0
while [ $x -lt 10 ]
do
echo -n $x
x=$(( $x + 1 ))
done
Sentencia while {1J2)
# SALIDA #
0123456789
apacitacin 2005 KT ngeniera Electrnica SRL
77
- Bucles anidados
while condicin1 ; bucle principal
do
comandos...
while condicin2 ; bucle anidado
do
comandos...
done
comandos...
done
- No hay restricciones relacionadas con el nivel de anidacin
x=0
while [ "$x" -lt 10 ] ;
do
y="$x"
while [ "$y" -ge 0 ] ;
do
echo "$y \c"
y=$(( $y - 1 ))
done
echo $x
x=$(( $x + 1 ))
done
Sentencia while {2J2)
SALIDA
0
...
9
apacitacin 2005 KT ngeniera Electrnica SRL
78
- Sintaxis:
until comndo ; comndo condicin comando test
do
comndo(s)...
done
- Se ejecuta hasta que la condicin sea verdadera
- Es la "negacin" del bucle while
- Ejecucin:
1. Se ejecuta comndo
2. Si el exit sttus de comndo es cero, finaliza el until
3. Si el exit sttus de comndo no es cero, se ejecutan comndo(s)...
4. uando finalizan los comndo(s)... se retorna al paso 1
- Sintaxis in-line: until comndo ; do comndo(s)... ; done
- Ejemplo:
x=1
until [ $x -gt 10 ] while [ ! $x -gt 10 ]
do
echo -n $x
x=$(( $x + 1 ))
done
Sentencia until
apacitacin 2005 KT ngeniera Electrnica SRL
80
- Existe el riesgo de escribir bucles infinitos
x=0
while [ x -lt 10 ] # Error, v $x lll
do
echo $x
x=$(( $x + 1 ))
done
- brek finaliza el bucle que la contiene
- continue provoca un salto hasta la prxima iteracin, saltando el
resto de los comandos de la iteracin actual
- ambas construcciones pueden eventualmente tomar un parmetro
numrico, break N = finaliza los bucles hasta el nivel N de anidacin
- Ejemplo:
while :
do
read CMD
case $CMD in
[qQ]|[qQ][uU][iI][tT]) brek ;;
*) process $CMD ;;
esac
done
omandos brek y continue
apacitacin 2005 KT ngeniera Electrnica SRL
82
Mdulo 7
Funciones
apacitacin 2005 KT ngeniera Electrnica SRL
83
- Las funciones mejoran la programacin de shell scripts:
- uando se invoca una funcin, la misma estar previamente
cargada en memoria velocidad de ejecucin
- Modularizacin, depuracin, reutilizacin de cdigo
- Es una implementacin limitada respecto a otros lenguajes
- Necesariamente deben estar definidas antes de su invocacin
- Dentro de una funcin $1, $2, $3,... sern los parmetros pasados a
la misma, no al script en s
- Sintaxis permitidas:
function nombre_funcion { nombre_funcion () {
comndo... comndo...
} }

- Ejemplo:
!/bin/bash

sludo () {
echo -n Hola
}

saludo
echo Mundo
Introduccin
apacitacin 2005 KT ngeniera Electrnica SRL
84
- Una variable es considerada como local si slo es visible dentro del
bloque de cdigo en el cual aparece, es decir tiene alcance {scope)
local. En el caso de funciones las variables locales slo tienen
significado dentro de la funcin.
- $vr1 es visible tanto para sript como
para funcion. Es una variable global
- $0, $1, $2 son visibles slo para sript
- $1 y $2 son visibles slo para funcion
- Nota:
funcion puede definir una variable local
denominada vr1, pero debe anteponer
la palabra reservada local
locl vr1
Variables locales y globales
apacitacin 2005 KT ngeniera Electrnica SRL
86
- las declaraciones de funciones pueden aparecer en casi cualquier
lugar, inclusive donde ira un comando
$ ls -l | f () { echo "22"; } Correcto, aunque intil
- bash admite funciones anidadas
!/bin/bash
f1 () {
f2 () { funcion anidada
echo "Funcion \"f2\", dentro de \"f1\"."
}
}
f2 Provoca un error
Visibilidad y definiciones
apacitacin 2005 KT ngeniera Electrnica SRL
87
- on source o con "." podemos incluir el cdigo de otro script en el
nuestro:
!/bin/bash
source funciones.sh en funciones.sh se define sum
sum 1 3
sum 12 12312
- exit y retrun
exit sttus
Es el valor que retorna la funcin.
Puede ser especificado explicitamente por retrun, de otra manera sera el
exit status del ultimo comando ejecutado. Se obtiene su valor mediante $?
retrun [n]
Termina una funcin, el argumento entero opcional es retornado al script
invocante como el exit status de la funcin y se asigna a $?
- Nota: El entero positivo mas grande que una funcin puede retornar es 255
Las versiones superiores a 2.05b del bash no sufren de esta limitacin.
Modularizacin y terminacin
apacitacin 2005 KT ngeniera Electrnica SRL
88
!/bin/bash
Verificando el valor del mximo entero que puede retornarse
return_test () {
return $1
}
return_test 27 bien
echo $? imprime 27
return_test 255 bien aun
echo $? imprime 255
return_test 256 Error!
echo $? imprime 1 (cdigo error miscelaneo)
Alternativa: uso de variable global
Return_Vl= Variable global para almacenar el valor de retorno
lt_return_test () {
Return_Vl=$1
return Returns 0 (success).
}
alt_return_test 256
echo "return value = $Return_Vl" 256
Terminacin ejemplo
apacitacin 2005 KT ngeniera Electrnica SRL
90
Mdulo S
Entrada y Salida
Redirecciones
apacitacin 2005 KT ngeniera Electrnica SRL
9
- 'Redireccionar' significa capturar la salida de un archivo, programa,
script o hasta de un bloque dentro de un script y enviarla como
entrada a otro archivo, comando, programa o script
- uando se ejecuta un comando se abren y asocian con el mismo tres
archivos representados por nmeros bajos {file descriptors)
- Se puede asociar cualquier archivo con descriptores de archivos
mediante el comando exec {facilitar la referencia)
$ exec 4>cpitulo4.txt
- bash ofrece muchos operadores de redireccin
Introduccin
Comando
STDIN (0)
STDOUT (1)
STDERR (2)
apacitacin 2005 KT ngeniera Electrnica SRL
92
- red
Sintaxis:
red [- nme] [-p prompt] [-er] [vrible...]
Lee el valor de una variable desde STDIN
on la opcin - permite leer variables tipo array
Ejemplos:
!/bin/bash
echo -n "Ingrese su nombre: "
red nme
echo "name = $name"
echo -n "Ingrese su fecha de nacimiento (dd mm aaaa): "
red di mes nyo
Un red sin variable{s) asociada{s) provoca que se establezca REPLY
Algunas opciones de red
-t Entrada temporizada
-p prompt Permite establecer un prompt para guiar la entrada
-n N Aceptar slo N caracteres de la entrada
Interaccin con el usuario {1J3)
apacitacin 2005 KT ngeniera Electrnica SRL
94
- echo
Sintaxis:
echo [-neE] [rg...]
Imprime texot por STDOUT
Por defecto imprime un carcter nuev-line, con -n se suprime
on la opcin -e interpreta caracteres especiales
\b Backspace
\c Suprime nuev-line
\f Formfeed
\n nuev-line
\r Retorno de carro
\t Tabulador
\\ Backslash
\nnn aracter cuyo valor ASII es el octal nnn
Ejemplos:
$ =`echo "HOLA" | tr A-Z -z`
$ echo $
hola
$ echo -e "Nuev \nLine"
Nueva
Linea
Interaccin con el usuario {2J3)
apacitacin 2005 KT ngeniera Electrnica SRL
95
- printf
Sintaxis:
printf cden-de-formto... [prmetro...]
Es una mejora a echo, versin limitada de la funcin printf() de
Se utiliza para formatear texto de salida
Generalmente ubicado en /bin o /usr/bin
Ejemplos:
PI=3.14159265358979
NRO=1234
Palabra1=Shell
Palabra2=Scripts
printf "Pi con dos cifras decimales = %1.2f" $PI
printf "Numero = \t%d\n" $NRO
printf "[%s\t%s]\n" $Palabra1 $Palabra2
Interaccin con el usuario {3J3)
apacitacin 2005 KT ngeniera Electrnica SRL
96
cmd1 | cmd2 Pipe, toma STDOUT de cmd1 como STDIN del cmd2

> rch STDOUT a rch, si rch existe lo reemplaza
< rch Toma STDIN desde rch

>> rch STDOUT a rch, escribe al final si rch existe
>| rch Fuerza STDOUT a rch aun si noclobber est establecido
n>| rch Idem para el archivo cuyo descriptor de archivo es n

<> rch Usa rch como STDIN tanto como STDOUT
n<> rch Usa rch como STDIN tanto como STDOUT para el descr. arch n

<< lbel Here document
n> rch Direcciona el descriptor de archivo n a rch

n< rch Toma el descriptor de archivo n desde rch

n>> rch Direcciona el descriptor de archivo n a rch, agrega datos al final
de rch si ya existe
Tabla de operadores de redireccin {1J2)
apacitacin 2005 KT ngeniera Electrnica SRL
98
n>& Duplica STDOUT del descriptor de archivo n

n<& Duplica STDIN del descriptor de archivo n

n>&m El descriptor de archivo n se transforma en una copia del
descriptor de archivo de salida m

n<&m El descriptor de archivo n se transforma en una copia del
descriptor de archivo de entrada m

&>rch Direcciona STDOUT y STDERR a rch

<&- ierra STDIN
>&- ierra STDOUT
n>&- ierra STDOUT del descriptor de archivo n

n<&- ierra STDIN del descriptor de archivo n
Tabla de operadores de redireccin {2J2)
apacitacin 2005 KT ngeniera Electrnica SRL
99
$ ct >> .bshrc
alias ll='ls -lha'
alias rm='rm -i'
^D
$ ct < rchivo1 > rchivo2
similar a cp archivo1 archivo2
$ lpr << MIS_URLS
http://sun.sunsolve.com
http://docs.sun.com
http://www.sunfreeware.com
MIS_URLS
$ echo Mensje 1>&2
Ejemplos
apacitacin 2005 KT ngeniera Electrnica SRL
00
Mdulo 9
Herramientas
miscelaneas
apacitacin 2005 KT ngeniera Electrnica SRL
0
- Herramientas tiles para la confeccin de scrpits
- omandos propios del shell {built-in)
evl
: (dos puntos)
type
- omandos externos
sleep
find
xrgs
expr
bc
- Los comandos built-in se ejecutan de manera ms eficiente que los
externos pues no existen accesos a disco para su ejecucin
Introduccin
apacitacin 2005 KT ngeniera Electrnica SRL
02
- Puede utilizarse cuando se desea que el shell reprocese la lnea de
comandos por segunda vez
- Sintaxis:
evl culquier_comndo
- Ejemplo:
$ SALIDA="> out.file"
$ echo hola $SALIDA
hola > out.file
$ eval echo hola $SALIDA
$ se creo el archivo out.file
- Luego se puede cambiar el valor original de SALIDA y as afectar a
todas las lneas que comiencen con eval y contengan $SALIDA
- til para el caso en que se desea componer una lnea de comandos
utilizando metacaracteres contenidos en variables o producidos
debido a sustitucin de comandos
omando evl
apacitacin 2005 KT ngeniera Electrnica SRL
03
- No hace nada, retorna 0 indicando ejecucin de comando exitoso
- Puede utilizarse con seguridad en cualquier lugar donde se requiera
un comando por cuestiones puramente sintcticas
- Ejemplos:
if [ -x $CMD ]
then
:
else
echo Error: $CMD no es ejecutable >&2
fi
- onstruccin de bucles infinitos
while : ms eficiente que while true
do
echo "Ingrese una palabra: \c"
read ENTRADA
[ "$ENTRADA" = "basta" ] && break
done
- El uso de : provoca que el shell evale sus argumentos, esto es til
para invocar sustituciones de variables
omando :
apacitacin 2005 KT ngeniera Electrnica SRL
04
- Brinda el path absoluto de uno o ms comandos
- Sintaxis:
type comndo...
- Si comndo no es un comando externo al shell, type responder
- Es un comando built-in
- Es una palabra reservada del shell
- Es un alias
- Si es un alias de un comando, type tambin dar el comando
subyacente
- Ejemplo:
$ type true vi case eval history
true is /bin/true
vi is /usr/bin/vi
case is a keyword
eval is a shell builtin
history is an exported alias for fc -l
omando type
apacitacin 2005 KT ngeniera Electrnica SRL
06
- Provoca una pausa por un nmero determinado de segundos
- Sintaxis:
sleep n
- Algunos tipos de UNIX permiten otras unidades de tiempo
- Puede ser usado para ofrecer una cantidad de segundos al usuario
para que lea un pantalla antes de que esta desaparezca
- Ejemplos:
echo -e "Ingrese un valor!\a"
sleep 1
echo -ne "\a"
sleep 1
echo -ne "\a"
while :
do
echo ======================================
date
echo ======================================
who
sleep 300 5 minutos
done >> logfile
omando sleep
apacitacin 2005 KT ngeniera Electrnica SRL
07
- omando muy poderoso, provee un mecanismo muy flexible para
crear una lista de archivos que verifican ciertos criterios
- Sintaxis:
find directorio_prtid opciones cciones
- Ejemplos:
$ find / -name core -print -print es considerado por defecto
$ find / -name '*core*' * ? [crcteres] [!crcteres]
$ find / -type d
$ find / -size +2000 2000 bloques de 512 bytes
$ find / -mtime -5
+n Nodificados hace mas de n dias atras
n Nodificados exactamente hace n dias
-n Nodificados hace menos de n dias
-mtime Modificcin
-time Acceso
-ctime Crecin, permisos, propiedd
$ find / -atime +100 -exec rm -i {} \;
omando find {1J2)
apacitacin 2005 KT ngeniera Electrnica SRL
08
- ombinacin de criterios
- And
$ find / -size +50 -mtime -3 -print
$ find / -size +50 -print -mtime -3 se ignora -mtime -3
- Or
$ find / \( -size +50 -o -mtime -3 \)
- Not
$ find /dev ! \( -type b -o -type c -o type d \)
- Si mediante -exec hay que procesar muchos archivos como en
$ find / -name core -exec rm -i {} \;
utilizar en su lugar xrgs como en
$ find / -name core | xrgs rm -i
Este comando tambin borra los archivos core pero mucho ms
rpido y con menos sobrecarga que -exec que llama rm -i para cada
archivo
omando find {2J2)
apacitacin 2005 KT ngeniera Electrnica SRL
0
- Acepta una serie de palabras desde la STDIN y las dispone como
argumentos para un comando dado
- Ejemplo:
$ cat lista_archivos | xargs rm
- Si el nmero de archivos es demasiado grande xargs ejecuta rm
varias veces
- Puede especificarse cuantos argumentos de STDIN sern procesados
como argumentos para el comando mediante la opcin -n
$ cat lista_archivos | xargs -n 20 rm # borrr de 20 en 20
$ ls
capitulo1 capitulo2 caratula
notas prologo
$ ls | xargs -n 2 echo --
-- capitulo1 capitulo2
-- caratula notas
-- prologo
- Problema
$ rm a*
rm: arg list too long
$ ls | grep '^' | xrgs -n 20 rm
omando xrgs
apacitacin 2005 KT ngeniera Electrnica SRL

- til para realizar operaciones aritmticas enteras simples en
notacin infija
- Sintaxis:
expr operndo1 operdor operndo2
- Operadores:
+ Suma
- Resta
\* Multiplicacin {operador quoted)
/ Divisin entera
% Resto de la divisin
- expr requiere espacios para separar sus argumentos
- Ejemplos:
$ expr 3 + 2
5
$ expr ABRIL : '[A-G]*'
2
$ mil=diego@mil.com
$ [ expr "$mil" : '.*' -eq expr "$mil" : '.*@.*\..*']
//En scritps CNT=expr $CNT + 1
omando expr
apacitacin 2005 KT ngeniera Electrnica SRL
2
- Potente utilidad para realizar clculos numricos no restringida a los
entros
$ bc
scale=4
8/3
2.6666
2.5 * 4.1/6.9 Los espacios son opcionales
1.4855
quit

- Operadores:
+ Suma
- Resta
* Multiplicacin {operador quoted)
/ Divisin entera
% Resto de la divisin
^ Exponenciacin

- Opera de manera precisa con nmeros de cualquier tamao
9238472938742937 * 29384729347298472
271470026887302339647844620892264
omando bc
apacitacin 2005 KT ngeniera Electrnica SRL
4
- Usos tpicos en scripts
AVERAGE=echo "scale=4; $PRICE/$UNITS" | bc
PI=$(echo "scale=10; 4*a(1)" | bc -l) a: atan(x)
-l: mathlib
- Permite realizar conversiones en diferentes bases
Es importante establecer primero la base output
$ bc
obase=16 base output = hexadecimal
ibase=8 base input = octal
400
100
77
3f
l0*3
18
quit
omando bc
apacitacin 2005 KT ngeniera Electrnica SRL
5
Mdulo 10
Filtros
apacitacin 2005 KT ngeniera Electrnica SRL
6
+ omandos que leen alguna entrada, realizan una transformacin de
la misma o calculan valores mediante esta y escriben alguna salida
+ omandos de filtrados tpicos
- sort: Ordena lneas de archivos de texto (sort -k, sort -f)

- tr: Traduce o elimina caracteres (trabaja con STDIN)

- uniq: limina lneas duplicadas en un archivo ordenado (sort -u)

- hed: Muestra las primeras lneas de un fichero

- til: Muestra las ltimas lneas de un fichero

- wc: stadsticas simples para archivos de texto

- rev: Invierte cada lnea de una archivo y la enva a STDOUT

- ct: Concatena el contenido de uno o ms archivos (ct -n)

- cut: Imprime partes seleccionadas de los archivos de entrada
(cut -b)
Filtros
apacitacin 2005 KT ngeniera Electrnica SRL
8
Mdulo 11
Lenguaje wk
apacitacin 2005 KT ngeniera Electrnica SRL
9
- Aho - Weinberger - Kernighan
- La versin original fue escrita en 1977 en los laboratorios AT&T
- En 19S5 se escribi una versin ms potente {funciones,
expresiones regulares)
- wk es idneo para obtener informes o resmenes a partir de "datos
crudos" o de la salida de otros programas
- Est ms relacionado a un lenguaje de programacin {) que a un
editor, como lo est sed
- Los programas wk son breves en general permitiendo su fcil
composicin con otros comandos y programas
Introduccin
apacitacin 2005 KT ngeniera Electrnica SRL
20
- Forma general
wk 'progrm' rchivo ...

- Un progrm wk consiste en una o ms reglas de la forma
ptrn { ccin } # las llaves separan la acciones de los patrones
ptrn { ccin }
...

- Perspectiva wk de la entrada
rchivo = secuencia de lneas o registros
registros = secuencias de cmpos

- wk consume cada rchivo ... registro por registro analizando si
entre sus campos "est presente" el ptrn, si es as se aplica la
ccin sobre este registro

- wk es case sensitive

- wk NO altera al contenido de los rchivo ...
Generalidades
apacitacin 2005 KT ngeniera Electrnica SRL
22
$ wk '/bc/ {print $0}' rchivo
- Nota: Barras / y comillas '
- El patrn o la accin pueden omitirse pero no ambos a la vez
- ptrn omitido se realiza la accin para cada lnea
- ccin omitida la accin por defecto es replicar la lnea
- Ejemplos:
wk '{print $0}' rchivo e ct rchivo
wk '/bc/' rchivo e grep bc rchivo
- Ejemplos ms elaborados:
$ wk '/100/ {print $0}
/200/ {print $0}' cuots_pgs impuestos
Nota: si en una linea aparece tanto 100 como 200 se imprimira dos veces!
$ ls -l | wk '$6=="Jun" { sum+=$5 } END { print sum }'

Primeros ejemplos
apacitacin 2005 KT ngeniera Electrnica SRL
23
- En lnea de comandos, eventualmente como parte de un pipeline
wk 'progrm' rchivo.
- omo script
wk -f script.wk rchivo.
- Sin archivos de entrada aplica el programa a la entrada estndar
{Ctrl-d) para terminar
wk 'progrm' o wk -f sript.wk

- omo ejecutable
#! /bin/wk -f
# Primer script
BEGIN {print Hol Mundo}
Ejecucin de programas wk
apacitacin 2005 KT ngeniera Electrnica SRL
24
- ada linea de un programa wk es una sentencia o regla indepen-
diente
- Una sentencia puede ocupar ms de una lnea dividindola con
nueva-lnea detrs de alguno de los caracteres:
, { : || && do else
de otra manera la nueva-lnea indicara fin de sentencia
- Se puede cortar tambin con el carcter \ en cualquier punto
wk '/ofert de fin de mes/ \
{print $0}' list-precios
- El carcter ; se utiliza para colocar ms de una sentencia en una
misma lnea
wk '/100/ {print $0} ; /200/ {print $0}' impuestos
Sentencias y lneas
apacitacin 2005 KT ngeniera Electrnica SRL
26
- awk consume la entrada en registros, divididos a su vez en campos
- on las variables built-in se puede cambiar esto
- variable RS {Record Seprtor): separador de registros
wk 'BEGIN {RS=/}; {print $0}' fechs
//cmbi RS ntes de consumir entrd
- RS= indica que los registros sern separados por lneas en blanco
- variable FS {Field Seprtor): separador de campos
- variable FNR: almacena la cantidad de registros ledos hasta el
momento del archivo actual, este valor se reinicia con cada archivo
- variable NR {Number of Records) guarda el nmero total de
registros ledos {no se reinicia automticamente)
- variable NF {Number of Fields) guarda la cantidad de campos en
un registro
- Referenciando campos:
- $0: Registro completo
- $1: Primer campo del registro
- $2: Segundo campo del registro
- ...
- $NF: Ultimo campo del registro
Interpretacin de la entrada
apacitacin 2005 KT ngeniera Electrnica SRL
27
/expresin regulr/
- El texto del registro de entrada concuerda con la expresin regular
- Ejemplos:
/texto/ oncordancia con texto
/x+/ Una o ms ocurrencias de x
/x?/ Una o ninguna ocurrencia de x
/x|y/ Tanto x como y
(string) Agrupa una cadena para usar con + o ?
$1 ~ /exp-reg/ oncordancia de campo
expresin
- Vale cuando su valor es distinto de 0 {si representa un nmero) o no nulo {si
representa una cadena)
- expresin se evalua cada vez que la regla se chequea contra un nuevo registro
- Puede ser una expresin de la forma $N, que dependa del registro actual
Patrones {1J2)
apacitacin 2005 KT ngeniera Electrnica SRL
28
ptron1, ptron2
- Especifican un rango de registros
- ptron1 {patrn de inicio), ptron2 {patrn de fin)
- uando un registro concuerda con ptron1 comienzan a chequearse los
siguientes registros contra ptron2, luego realiza la misma tarea desde el ppio
$ wk '$1 == 17/05/2005, $2 == 20/06/2005'
BEGIN END
- Son patrones especiales, no se utilizan como filtro
- Brindar la posibilidad de realizar tareas antes y despus de procesar la entrada
- Tanto BEGIN como END se ejecutan slo una vez
- No pueden ser usados en rangos o con operadores booleanos
- Deben estar acompaados por accion{es) pues no existen acciones por defecto
para estas reglas
null
- Especifican cualquier secuencia de caracteres, es decir, todos los registros
concuerdan con este
Patrones {2J2)
apacitacin 2005 KT ngeniera Electrnica SRL
30
- Expresiones de comparacin de patrones
x < y Verdad si x es menor que y
x <= y Verdad si x es menor o igual que y
x > y Verdad si x es mayor que y
x >= y Verdad si x es mayor o igual que y
x == y Verdad si x es igual a y
x != y Verdad si x es distinto de y
x ~ y Verdad si x concuerda con la expresin regular y
x !~ y Verdad si x no concuerda con la expresin regular y
- Operadores booleanos de patrones
! no
|| o
&& y
- Ejemplos:
$ wk '$1 == 5000 { print $1, $2}'

$ wk '/100/ && /200/'

$ wk '! /100/'

$ wk '/s/ || /srl/'
Operando con patrones
apacitacin 2005 KT ngeniera Electrnica SRL
3
- Una accin = una o ms sentencias wk y se encierra entre llaves {}
- Las sentencias son separadas por caracteres nueva-linea o ;
- Tipos de sentencias
- Expresiones
Invocacin de funciones, asignacin de variables, variables y funciones
built-in

- Sentencias de control
Similares a las del lenguaje : if, for, while, do-while, brek, continue

- Sentencias compuestas
onsisten en una o ms sentencias encerradas entre llaves, bloques

- ontrol de entrada
getline y next

- Sentencias de salida
print y printf

- Sentencia de borrado
Para eliminar elementos de un array
Acciones
apacitacin 2005 KT ngeniera Electrnica SRL
32
- Son de las ms utilizadas como accin
- print (item1, item2, ...) # los parntesis son necesarios a veces
- print print $0
- print lnea en blanco
- Separadores de salida
- OFS Output Field Seprtor {espacio por defecto)
- ORS Output Record Seprtor {nueva-linea por defecto)
- Ejemplos:
$ wk 'ptron { print }' _ent > _sl
$ grep patron a_ent > a_sal
$ wk 'BEGIN { print line uno\nline dos }'
linea uno
linea dos
$ dte | wk '{ print $1,$2}'
Ene 14
$ dte | wk '{ print $1,$2}'
Ene14
$ dte | wk '{ print Precio Unitrio
print ====== ======== }' factura
$ wk 'BEGIN { OFS = ;; ORS = \n\n }
{ print $1, $3, $NF }' listado
Sentencias print y printf {1J2)
apacitacin 2005 KT ngeniera Electrnica SRL
34
- printf formto item1, item2, ... # los ( ) son necesarios a veces
- formto es una cadena que indica como deben imprimirse los tems
- es una versin inferior a la funcin printf() de
- no coloca automticamente un carcter nueva-linea al final
printf %f\n, $2
- Ejemplos:
$ wk '{ printf (%-10s, %d, %c)\t, $1, $3, $4 }' inventario
$ wk 'BEGIN { formt = %-10s %s\n
printf formt, Nombre, Nmero
printf formt, ------, ------ }
{ printf formt, $1, $2 }' archivo_con_datos
- Redirecciones
$ wk '{ print $2 > list-telefonos
print $1 > list-nombres }' archivo_con_datos
$ wk '{ print $1 > nombres-desordendos
print $1 | sort -r > nombres-ordendos }' archivo_con_datos
Sentencias print y printf {2J2)
apacitacin 2005 KT ngeniera Electrnica SRL
35
- wk 'NF > 0' slo lneas no vacas
- ls -l rchivos |
wk '{ x += $4 } ; END { print "totl bytes: " x }'
cantidad de bytes ocupados en un directorio
- wk '{ if (NF > mx) mx = NF }
END { print mx }'
imprime el nmero mximo de campos entre los registros
- - wk '{ nlines++ } ; END { print nlines }'
- - wk 'END { print NR }'
cantidad de lneas en archivo(s), wc -l
- wk '{ print NR, $0 }'
numera toda lnea de entrada, ct -n
"one-liners" tiles {1J2)
apacitacin 2005 KT ngeniera Electrnica SRL
36
- wk 'BEGIN { FS = ":" }
{ print $1 | "sort" }' /etc/psswd
imprime una lista ordenada de los nombres de usaurio
- wk 'length($0) > 80'
imprime las lneas que contengan ms de 80 caracteres
"one-liners" tiles {2J2)
apacitacin 2005 KT ngeniera Electrnica SRL
37
- wk '{ i = 1 imprime los primeros tres campos
while (i <= 3) { de cada registro
print $i
i++ i=$i+1
}
}'
- wk '{ for (i = 1; i <= 3; i++) idem anterior
print $i
}'
- Bash script con cdigo awk embebido
#!/bin/bsh
PASSWORD_FILE=/etc/psswd
n=1 # Numero de usurio
for nme in $(wk 'BEGIN{FS=":"}{print $1}' < "$PASSWORD_FILE" )
do
echo "USER #$n = $nme"
let "n += 1"
done
Ejemplos varios
apacitacin 2005 KT ngeniera Electrnica SRL
38
Mdulo 12
Lenguaje sed
apacitacin 2005 KT ngeniera Electrnica SRL
39
+ Es un "editor de flujo" {stream editor)
+ Deriva del editor ed
+ onsume cada lnea de los archivos de entrada aplicando comandos
a las mismas, sin alterar a los mismo
+ Sintaxis:
sed opciones 'comndo_ed' rchivos.

+ Nota: las comillas '' son generalmente indispensables debido a los
metacaracteres {evitar expansiones)
+ Opciones:
-n: indica que se suprima la salida estndar
-e script: indica que se ejecute el script que viene a continuacin.
Si no se emplea la opcin -f se puede omitir -e.
-f archivo: indica que los comandos se tomarn de un archivo
+ Los comandos son de la forma /ptron/ ccion
- ptron es una expresin regular
- ccion es uno de los siguientes comandos {hay ms)
p Imprime la linea
d Borra la linea
s/p1/p2/ Sustituye la primer ocurrencia de p1 con p2
sed
apacitacin 2005 KT ngeniera Electrnica SRL
40
# Comportamiento por defecto: imprimir la entrada a STDOUT
sed kq hed -k # Del ppio a la lnea k-sima
sed -n '1p' rchivo # Devuelve la 1er lnea, -n sin el texto original
sed -n '4,6p' rchivo # Devuelve las lneas 4 a la 6
Otra manera de hacer lo anterior: sed 10,20\!d
sed -n '4,$p' rchivo # Devuelve las lneas 4 al final til -4
sed -n /^E/ rchivo # Devuelve toda lnea que empieza con "E"
sed -n '/^E/,$p' rch # Desde la 1er lnea que empiece con "E"
al final
sed '3d' rchivo # Borra la 3ra lnea de rchivo
sed '\Line nuev' rchivo
# Aade la lnea con el contenido "Line
nuev" despus de cada lnea de rchivo
$ sed '/0\.[0-9][0-9]$/p' precios.txt
$ sed -n '/0\.[0-9][0-9]$/p' precios.txt
$ sed '/^[Bb]lnco/d' colores.dat > colores-nuevo.dat
Ejemplos de uso de sed
apacitacin 2005 KT ngeniera Electrnica SRL
4
+ Sustituciones
JptronJsJptron1Jptron2
- ptron1 es reemplazado por ptron2 en toda lnea que concuerde con ptron
- se realiza un reemplazo por lnea {comportamiento por defecto)
- si se omite ptron se habilita el reemplazo para todas las lneas
$ sed 's/Celeste/Celsete/' colores

- para realizar ms de un reemplazo se utiliza g {global)
$ sed 's/ms/ms/g' carta
- slo el reemplazo tiene efecto en las lneas 1 a la 3
$ sed '1,3s/s/SA/g' carta

- sustituciones homlogas: 1x, 2y, 3z
$ sed 'y/[123][xyz]/g/' listado
- reutilizando una expresin regular
$ sed 's/ *[0-9][0-9]*\.[0-9][0-9]$/\$&/' precios.txt
- comandos mltiples
sed -e 'comndol' -e 'comndo2' ... -e 'comndoN' archivos
Ejemplos de uso de sed
apacitacin 2005 KT ngeniera Electrnica SRL
43
Mdulo 13
Depuracin de scripts
Ejercitacin
apacitacin 2005 KT ngeniera Electrnica SRL
44
+ Debugging = deteccin y eliminacin de problemas ligados a la
correctitud {sintctico-lgica) y el desempeo {performance)

+ "Sntomas" de un script con errores:
- Arroja un error sintctico, detiene su ejecucin
- Se ejecuta, pero no trabaja como debera, error lgico
- Se ejecuta como era esperado, pero realiza efectos laterales no
deseados {bomba lgica)

+ echo's es la primer opcin, obviamente rudimentaria

TRAZA
+ omunmente se inicia un subshell con la opcin -x establecida para
ejecutar un script en modo debug
$ bsh -x script.sh
Esto produce una "traza", cada comando con sus argumentos en script.sh
se imprimen por STDOUT, luego de realizar expansiones y antes de ejecutarlos

Depuracin de scripts {1-2)
apacitacin 2005 KT ngeniera Electrnica SRL
45
+ Opciones de debugging
set -f set -o noglob
Desactiva generacin de nombres de archivo usando metacaracteres (globbing)
set -v set -o verbose I
Imprime comandos luego de ejecutarlos. Visualizar que produjo la salida
set -x set -o xtrce
Imprime la traza de los comandos antes de ejecutarlos
set -n set -o noexec
Lee comandos pero no los ejecuta. Deteccin de errores de sintaxis
set -u set -o nounset
Da mensajes de error al intentar utilizar variables no definidas

+ Activar y desactivar modos mediante - y + respectivamente

+ Pueden establecerse opciones de debugging en parte de un script
set -x # ctiv debugging desde qu
# comndos del script ...
set +x # desctiv debugging desde qu
# comndos del script ...
+ ontrol de eficiencia mediante comando time
Depuracin de scripts {2-2)
apacitacin 2005 KT ngeniera Electrnica SRL
46
+ Nivel inicil
- Interfaz para el comando cl

- Efectuar un backup {.tr.gz) de los archivos de su home que no
han sido modificados desde la ltima semana

- Imprimir todos los nmeros primos entre 1 y 500

- Invertir el contenido de un archivo {tc)

+ Nivel medio
- Interfaz {exhaustiva) para el comando cp
- Interfaz {exhaustiva) para el comando find

- Parseo del archivo /etc/pssw y desplegar su contenido de manera
ms fcil de leer

- Ecuacin cuadrtica x
2
+bx+c=0
Ejercicios y Programas
apacitacin 2005 KT ngeniera Electrnica SRL
47
Mdulo 14
Conclusiones
apacitacin 2005 KT ngeniera Electrnica SRL
48
- Tareas de uso intensivo de recursos, especialmente cuando la
velocidad es un factor importante (sorting, hashing)
- Procedimientos que involucren clculos matemticos pesados, en
especial los que involucren aritmtica de punto flotante
- Portabilidad (utilizar C en su lugar)
- Aplicaciones complejas donde se requiere programacin
estructurada (typechecking, prototipos de funciones)
- Aplicaciones muy crticas
- Necesidad de operaciones de archivo intensivas
- Necesidad de arrays multi-dimensionales
- Necesidad de estructuras de datos como listas enlazadas o rboles
- Necesidad de generar o manipular GUIs
- Necesidad de acceso directo a hardware
- Necesidad de realizar EJS a travs de puertos o sockets
- Aplicaciones de cdigo-cerrado (Los shell scripts son necesariamente Open
Source)
uando NO utilizar shell scripts

You might also like