0% encontró este documento útil (0 votos)
18 vistas

02 ShellScripts

02-ShellScripts

Cargado por

Aneyka Hurtado
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PPTX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
18 vistas

02 ShellScripts

02-ShellScripts

Cargado por

Aneyka Hurtado
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PPTX, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 115

Diego

Diego
2008-11-03 15:40:59
2008-11-03 15:40:44
--------------------------------------------
--------------------------------------------

˘ ˇ
˘ ˇ

Programación de
Shell Scripts
Diego
2008-11-03 15:49:30
-------------------------------------------
- Ł

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 1


Diego
2008-11-03 15:40:53
--------------------------------------------

Agenda (módulos)
Contenido:
˘• ˇ Módulo 0 - Generalidades
• Módulo 1 - Introducción
• Módulo 2 - Caracteres especiales y Quoting
• Módulo 3 - Variables
• Módulo 4 - Operadores
• Módulo 5 - Construcciones condicionales
• Módulo 6 - Construcciones iterativas o de repetición
• Módulo 7 - Funciones
• Módulo 8 - Entrada y Salida - Redirección
• Módulo 9 - Herramientas Misceláneas
Diego
• Módulo 10 - Filtros
• Módulo 11
2008-11-03 15:49:32
-------------------------------------------- - Lenguaje awk
• Módulo 12 - Lenguaje sed
• Módulo 13 - Depuración de scritps. Ejercitación
• Módulo 14 - Conclusiones

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 2


Diego
2008-11-03 15:41:04
--------------------------------------------

Módulo 0
˘ ˇ

Generalidades
Diego
2008-11-03 15:49:35
--------------------------------------------

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 3


Diego
2008-11-03 15:41:10
--------------------------------------------

Generalidades
• Shell
˘
➊ ˇ Intérprete de comandos
➋ Lenguaje de programación
• Entorno de trabajo
- Case sensitive
- Si un programa no está en el PATH: ./nombre_programa
- Prompts:
: usuario normal
#: usuario administrador o superusuario (root)
• Com andos sintaxis: comando opciones argumentos
- Ubicaciones
/bin: comandos estándar para todos los usuarios (ls, cat, cp, mv)
Diego /sbin: comandos estándar para root (s utdown, mkfs)
/usr/bin: comandos para todos los usuarios no presentes en todo sistema UNIX
2008-11-03 15:49:37
--------------------------------------------

/usr/sbin: comandos para root no presentes en todo sistema UNIX


• Scripts
- Lista de comandos UNIX reunidos en un archivo. Reutilización de código
- Un script es un nuevo comando
Filosofía UNIX “crear comandos complejos a partir de comandos simples”
Capacitación ® 2005 KIT Ingeniería Electrónica SRL 4
Diego
2008-11-03 15:41:15
--------------------------------------------

Historia de los shell de U N I X


• El shell es independiente del S.O. → generación de docenas de shells
• Bourne shell (Steven Bourne, UNIX Version 7, 1979), conocido como sh
˘ ˇ
• Principal alternativa a sh fue el C shell (Bill Joy, BSD, 1981), csh
• Turbo C shell, tcsh, superconjunto de csh con mejoras respecto a
amigabilidad y velocidad
• Korn shell (David Korn, AT&T, 1986), ksh, comercial, {ksh} ≈
{sh} U {csh}
• Una alternativa sin costo es la versión de Korn shell conocida como
pdksh
(Public Domain Korn shell). pdksh está disponible como código fuente

• Bourne Again shell (Brian Fox, Chet Ramey, 1988-1993), bash


Diego - Creado para su uso en el proyecto GNU (Richard Stallman, FSF), no
2008-11-03 15:49:41

comercial
--------------------------------------------

- Se convirtó rápidamente en el derivado de Bourne Shell más popular


- Shell estándar utilizado ampliamente en los sistemas UNIX e incluido
en Linux
- {bash} ≈ {csh} U {ksh}
- Intuitivo y flexible
Capacitación ® 2005 KIT Ingeniería Electrónica SRL 6
Diego
2008-11-03 15:41:20
--------------------------------------------

Módulo 1
˘ ˇ

Introducción
Diego
2008-11-03 15:49:44
--------------------------------------------

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 7


Diego
2008-11-03 15:41:24
--------------------------------------------

Características de bash
{Bourne Shell} < {Bourne shell Again} ≈ { C Shell} U {Korn Shell}
˘ ˇ
• Características propias de C-shell incorporadas:
- Manipulación de directorios.
- Control de trabajos.
- Expansión de llaves, para la generación de cadenas arbitrarias.
- Carácter tilde (~), manera de referenciar al directorio home.
- Alias, que permiten referenciar más convenientemente comandos y sus opciones.
- Histórico de comandos, que posibilita reutilizar comandos previamente tipeados.

• Características propias:
- Edición de línea de comandos, permite usar comandos al estilo vi o emacs.
- Configuración de teclas (key bindings) permiten establecer secuencias de teclas de
Diego edición personalizadas .
- Características de programación integrada: la funcionalidad de comandos UNIX
2008-11-03 15:49:47
--------------------------------------------

(test,
expr, getopt, ec o) se integraron en el shell, permitiendo que tareas comunes de
programación sean realizadas más clara y eficientemente.
- Estructuras de control, especialmente el select para la generación sencilla de
menús.
- Opciones y variables nuevas permiten personilizar más el entorno.
- Arrays uni-dimensionales que
Capacitación permiten
® 2005 fácil acceso
KIT Ingeniería a lista
Electrónica SRL de datos. 8
Diego
2008-11-03 15:41:28
--------------------------------------------

Primer ejemplo
quien interpretará
˘ ˇ
el resto de los
script
comandos

ola.s
#!/bin/bash
#Primer script
echo Hola Mundo
comentario comando
Diego
2008-11-03 15:49:49
--------------------------------------------
Ł

Ejecución:
./ ola.s
Hola Mundo
Capacitación ® 2005 KIT Ingeniería Electrónica SRL 10
Diego
2008-11-03 15:41:32
--------------------------------------------

¿Cómo ejecuta un comando en shell?


➊ Lee la entrada desde un archivo, com o un argum ento 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 com andos sim ples


y compuestos

❹ Se hacen expansiones separando los tokens expandidos en listas


de nombres de archivo y comandos con sus argumentos

Diego
➎ Se realizan redireccionamientos, eliminando operadores
y operandos de redirección
2008-11-03 15:49:52
-------------------------------------------
- Ł Ł

➏ Se ejecuta el com ando

0 Opcionalmente se espera la finalización del mis mo para recoger su


exit status
Capacitación ® 2005 KIT Ingeniería Electrónica SRL 11
Diego
2008-11-03 15:41:40
--------------------------------------------

Archivos de configuración de bash ( 1 / 5 )


• Existen, eventualmente, tres archivos en el directorio home
˘ ˇ
.bas _profile
.bas rc
.bas _logout

• Se utilizan para definir variables y / o ejecutar comandos al


ingresar al sistema, cuando se invoca un nuevo shell o al cerrar la
sesión

• Pueden existir o no dependiendo de como se creo la cuenta de


usuario.
Si no existen, el usuario utilizará sólo el archivo de sistema
Diego /etc/profile, o puede optar por editarlos él mis mo
2008-11-03 15:49:55
--------------------------------------------
Ł

• El más importante es .bas _profile, el cual es leido por el


shell para ejecutar los comandos que contiene cada vez que se
ingresa al sistema

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 12


Diego
2008-11-03 15:41:43
--------------------------------------------

Archivos de configuración de bash ( 2 / 5 )


• Algunas líneas de .bas _profile
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin
˘ ˇ
SHELL=/bin/bas
MANPATH=/usr/man:/usr/X11/man
EDITOR=/usr/bin/vi
PS1='\ :\w\ '
PS2='S '
set -o ignoreeof
export EDITOR

• Si se agregan nuevas líneas no serán consideradas hasta que


el archivo .bas _profile sea leído/ejecutado nuevamente,
reingresando al sistema, por ejemplo
Diego
2008-11-03 15:50:00
--------------------------------------------
Ł • Comando source: Ejecuta los comandos en el archivo
especificado
source .bas _profile

• Alternativa para source comando, utilizar el comando punto


(.)
Capacitación ® 2005 KIT Ingeniería Electrónica SRL
./bas _profile 14
Diego
2008-11-03 15:41:47
--------------------------------------------

Archivos de configuración de bash ( 3 / 5 )


• bash admite dos sinónimos para .bas _profile:
˘
-.bas
ˇ
_login, derivado del archivo .login de C shell
-.profile, derivado del archivo .profile del B ourne shell y el
K orn shell

• Se lee sólo uno de estos al ingresar al sistema

• Orden: .bas _profile → .bas _login → .profile

• .bas rc puede o no existir

• AI iniciar un nuevo sheII (un subsheII) se Ieerán Ios comandos de


Diego .bas rc
2008-11-03 15:50:03
--------------------------------------------
Ł
• Separación de comandos de inicio y de personalización de shell

• Si .bas rc no existe entonces no se ejecutarán cuando se inicia


un subshell

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 15


Diego
2008-11-03 15:41:51
--------------------------------------------

Archivos de configuración de bash ( 4 / 5 )


# If running interactively, t en:
if [ " PS1" ]; t en
˘ ˇ
# don't put duplicate lines in t e istory.
# export HISTCONTROL=ignoredups
# enable color support of ls and also add andy aliases
eval `dircolors -b`
alias ls='ls --color=auto

# some more ls aliases


#alias ll='ls -l'
#alias la='ls -A'
#alias l='ls -CF'

# set a fancy prompt


PS1='\u@\ :\w\ '
# If t is is an xterm set t e title to user@ ost:dir
#case TERM in
Diego
2008-11-03 15:50:06#xterm*)
# PROMPT_COMMAND='ec o -ne "\033]0; {USER}@
--------------------------------------------
Ł
#
{HOSTNAME}: ;; {PWD}\007"
#*)
# ;;
#es
fi ac

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 16


Diego
2008-11-03 15:41:54
--------------------------------------------

Archivos de configuración de bash ( 5 / 5 )


•.bas _logout es leído y ejecutado cada vez que se sale del login
˘
shell
ˇ

• Brinda la capacidad de ejecutar comandos, como eliminar


archivos temporarios

• Generalmente hay que definirlo mediante edición manual

• Si no existe, no se ejecutarán comandos extra a la salida

Diego
2008-11-03 15:50:09
--------------------------------------------
Ł

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 18


Diego
2008-11-03 15:42:00
--------------------------------------------

Alias
• A veces la sintaxis de los comandos es difícil de recordar,
especialmente si se utilizan con varias opciones y argumentos
˘ ˇ
• Alias = sinónomo enriquecido
• Los alias pueden definirse en línea de comandos, en el
.bas _profile, o en .bas rc, mediante:
alias [name=command] / / 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 están permitidos los alias recursivos $ alias ls='ls -
la'
Diego
- Los alias sólo pueden usarse al principio de un comando
2008-11-03 15:50:12
--------------------------------------------
Ł (existen excepciones)
$ alias pkgs=/var/sadm/pkg
$ alias cd='cd '
• Implicancias
- Brevedad (ls=ls -lha) - Costumbre (dir=ls)
- Protección (rm=rm -i) - Personalización (moer=more)
Capacitación ® 2005 KIT Ingeniería Electrónica SRL 19
Diego
2008-11-03 15:42:08
--------------------------------------------

Opciones
• Los alias permiten definir nombres convenientes para los
comandos pero no cambian realmente el comportamiento del shell
˘ ˇ

• Una opción de shell se establece como activa/inactiva (on/off)


yˆ cambia efectivamente el comportamiento del shell
• Sintaxis básica (contraintuitiva)
set +o opcion off
set -o on
opcion
• Para visualizar el estado de las opciones set -o
• La mayoría de los nombres de opciones tienen asociado una letra
para abreviarlas, set -o noglob → set -f
Diego • Ejemplos: (en on)
2008-11-03 15:50:15

ignoreeof
--------------------------------------------
Deshabilita Ctrl-d para salir de la sesión; debe usarse exit
noclobber Deshabilita la redirección de salida (S) sobre archivos existentes
noglob Deshabilita la expansión de metacaracteres como * y ?
notify Reporta el estado de terminación de los jobs de inmediato
nounset Indica un error cuando se intenta utilizar variables no definidas
vi Entra al modo edición de vi directamente
Capacitación ® 2005 KIT Ingeniería Electrónica SRL 20
Diego
2008-11-03 15:42:11
--------------------------------------------

Módulo 2
˘ ˇ

Caracteres especiales
Diego
y Quoting
2008-11-03 15:50:17
--------------------------------------------

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 22


Diego
2008-11-03 15:42:17
--------------------------------------------

Caracteres especiales
• Conocidos también como metacaractes
˘ ˇ
• Los metacaracteres poseen significado especial para el shell

• Existen diversas categorías de acuerdo a la funcionalidad con


que estén relacionados

• Ejemplos:
$ cd -/libros
$ rm *.bck
$ find / -name a* & # Búsqueda prolongada
$ echo El dijo \”Hola\”
Diego
$ echo Fecha y hora actual: `date`
$ echo Hay `wc
2008-11-03 15:50:20
--------------------------------------------
-l /etc/passwd | awk '{print $1}'` usuarios

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 23


Diego
2008-11-03 15:42:21
--------------------------------------------

Caractes especiales
Caracte Significado
r - Directorio ome
˘ ˇ ` Sustitución de comando
Comentario
# Valor de variable
Trabajo en
&
* background
Estrella de Kleene
( (expresiones
\
) regulares)
| Inicio de subs
ell Fin de subs
[ ell Carácter de
] Escape Pipe
{ Inicio de conjunto de caracteres (expresiones regulares)
Diego } Fin de conjunto de caracteres (expresiones regulares)
2008-11-03 15:50:23
;
--------------------------------------------
Inicio de bloque de
' comandos Fin de bloque de
" comandos
c Secuencializar comandos
Comilla simple (Strong
S quote) Comillas dobles
/ (Weak quote)
? Redirección entrada
Capacitación
! ® 2005 KIT
Redirección Ingeniería Electrónica SRL
salida 24
Diego
2008-11-03 15:42:27
--------------------------------------------

Archivos, comodines y pathname expansion


• Los archivos ocultos comienzan con punto (.), utilizar ls -a
(a:all)
˘ ˇ
• Comodines ? un carácter cualquiera
* cualquier cadena de caracteres
[...] cualquier carácter entre los corchetes (conjunto)
[!... cualquier carácter no perteneciente al conjunto
]
• Conjuntos
[abc] a, b o c
punto, coma y punto y coma
[.,;] a, b o c
[a-c] Todas las minúsculas
[a-z] Ningún dígito
Diego
2008-11-03 15:50:27
[!0- Todos los dígitos y el
-------------------------------------------- 9] carácter !
[0- Todas las letras
• Expansión de9!] minúsculas
llaves (brace y
expansion)
[a-
prefijo{cadenas}sufijo mayúsculas
ec ozA-Z]ca{pa,ra,sa}s
capas caras casas
Capacitación ® 2005 KIT Ingeniería Electrónica SRL 26
Diego
2008-11-03 15:42:32
--------------------------------------------

Control keys
• La teclas de control (CTRL-letra) son otro tipo de
metacaracter
˘ ˇ
• Normalmente no imprimen nada
• RETURN = CTRL-m
BACKSPACE = CTRL-
• Pueden diferir de
Control
sistema Key Descripción
en sistema
CTRL-C Detiene el comando (envia SIGINT)
CTRL- actual Fin de entrad
D (eof)
CTRL-\ Detiene el comando actual
(si no funciona CTRL-C, envia
CTRL-S SIGQUIT) Detiene salida por pantalla
CTRL-Q Reinicia salida por pantalla
Diego
DEL
2008-11-03 15:50:30or CTRL-? Borra último carácter
--------------------------------------------
CTRL- Borra la última palabra de la línea de
W comandos Borra la linea de comandos entera
CTRL-U Suspende el proceso actual
CTRL- Cursor al principio de la línea de
Z comandos Cursor al final de la línea de
CTRL-A comandos Búsqueda recursiva de comandos
CTRL-
E
Capacitación
CTRL-R ® 2005 KIT Ingeniería Electrónica SRL 27
Diego
2008-11-03 15:42:35
--------------------------------------------

Qu oting
• 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 acción del shell
• Ejemplos:
ec o 2 * 3 S 1 es cierto
# No produce salida, que pasó?
ec o El valor de este producto es 120
El valor de este producto es 20
# Por que sale 20 y no 120?
ls [Aa]+
-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
Diego
2008-11-03 15:50:35

• Existen tres mecanismos de quoting


--------------------------------------------

- El carácter de escape \ (escape character)


- Comillas dobles ” (double quotes)
- Comillas simples ' (single quotes)

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 28


Diego
2008-11-03 15:42:39
--------------------------------------------

El carácter de escape
• Es el carácter \ (backslash)
•˘ Evita
ˇ
que el siguiente carácter sea interpretado por el shell

ec o 1234
234
ec o \ 1234
$1234

• Excepción: \newline, esta secuencia se interpreta como


continuación de línea eliminando posteriormente esta secuencia de
la entrada del comando

Diego
• Ejemplo:
ec o Texto escrito en \
2008-11-03 15:50:39
--------------------------------------------
S mas de una linea
Texto escrito en mas de
una linea

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 30


Diego
2008-11-03 15:42:44
--------------------------------------------

Comillas dobles
• Los caracteres encerrados entre comillas dobles preservan su
valor literal
˘ ˇ
• También se conoce como We a k 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 sólo si antecede los
caracteres
, ', “, \ o newline.

Diego
• Ejemplos:
2008-11-03 15:50:43
ec o “El reloj tiene un valor de 123”
--------------------------------------------
Ł
El reloj tiene un precio de 23
ec o “El reloj tiene un valor de \ 123”
El reloj tiene un precio de $123
ec o “Es un vino con buen 'bouquet'”
Es un vino con buen 'bouquet'

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 31


Diego
2008-11-03 15:42:56
--------------------------------------------

Comillas simples
• 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
• También se conoce como Strong quoting o Full quoting

• Excepción: \newline

• Ejemplos:
VAR=10
ec o ' VAR'
$VAR
Diego
ec o 'd* = el caracter cdS seguido de cualquier
2008-11-03 15:50:46

cadena, \ inclusive la vacía'


--------------------------------------------

ec o 'La comilla simple (') tamién es llamado


aopostrofo'

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 32


Diego
2008-11-03 15:43:01
--------------------------------------------

ANSI-C Quoting
• Las cadenas de la forma 'texto' son consideradas de manera
especial
˘ ˇ
La cadena se ex pande a texto con los caracteres de escape \
reemplazados como lo especifica el estándar ANSI-C
\a alerta (alerta)
\b retroceso (backspace)
\n nueva línea (new line)
\t tab horizontal (horizontal tab)
\v tab vertical (vertical tab)
\\ barra invertida (backslash)

• Ejemplos:
ec o Barra invertida =
Diego
'\\'
2008-11-03 15:50:49

Barra invertida = \
--------------------------------------------

ec o Se oye .... '\a'


Se oye .... (beep)
ec o Hola '\n' Mundo
Hola
Mundo
Capacitación ® 2005 KIT Ingeniería Electrónica SRL 34
Diego
2008-11-03 15:43:06
--------------------------------------------

Ejemplos combinados
ec o c- 1250.**S; (update?) [y|n]
$ echo
˘ ˇ
\<-\$1250.\*\*\>\; \(update\?\) \[y\|n\]
$ echo '<-$1250.**>; (update?) [y|n]'

ec o La variable ' UID' contiene el valor --\S " UID"


La variable $UID contiene el valor --> 1002

ec o It's cpartyS time!


Se solicita más entrada

Diego
2008-11-03 15:50:52
--------------------------------------------

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 35


Diego
2008-11-03 15:43:10
--------------------------------------------

Módulo 3
˘ ˇ

Variables
Diego
2008-11-03 15:50:56
--------------------------------------------

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 36


Diego
2008-11-03 15:43:13
--------------------------------------------

Introducción ( 1 / 2 )
• El uso de variables permite crear scripts flexibles y depurables
• Una variable tiene un nombre y un valor ( nombre)
˘ ˇ
• Para permitir concatenación {variable}cadena
• Bash es case sensitive
• Bash es un lenguaje NO fuertemente tipado
• Con el shell se pueden crear, asignar y borrar variables
- Creación $ var1=10 # sin
- Asignación espacios!
- Borrado $ unset
$ var2=$var1
• El nombre de una variable var1 puede contener sólo letras (a-z o A-
Z), números (0-9) o guión bajo (_) y comenzar con una letra o _
• Las variables con nombres “numéricos” están reservadas
• Ejemplos:
Diego
2008-11-03 15:51:02
--------------------------------------------
CantPersonas
cantpersona CANTPERSONAS
s
_Nueva_Variable_ esta-mal?
1 producto_12
• Preguntas: $ var3 = 33 0 10mil
$ $var2=50
$ 3=400
Capacitación ® 2005 KIT Ingeniería Electrónica SRL 37
Diego
2008-11-03 15:43:17
--------------------------------------------

Introducción ( 2 / 2 )
• No se advierten sobreescrituras
˘ ˇ
• Es posible almacenar en una variable el resultado de la ejecución
de un comando.
- Con acentos graves
$ lista_de_archivos=`ls`
- Con (...): 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 través la
primera
Diego
2008-11-03 15:51:05 dosmil=numero
--------------------------------------------
numero=2000
ec o dosmil #Referencia directa
numero
eval ec o \ #Referencia indirecta
dosmil
2000

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 38


Diego
2008-11-03 15:43:21
--------------------------------------------

Variables de shell y entorno


• 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 mayúsculas por convención

Diego • Variables de Shell


2008-11-03 15:51:07
- Establecidas y utilizadas por el shell para su
--------------------------------------------

funcionamiento
- Algunas son variables de entorno otras son locales
- Pueden visualizarse mediante el comando set
- Convencionalmente
PWD UID tienen nombres en mayúsculas
SHLVL
PATH HOME IFS (Internal Field Separator)
Capacitación ® 2005 KIT Ingeniería Electrónica SRL 39
Diego
2008-11-03 15:43:25
--------------------------------------------

Parámetros posicionales o argumentos ( 1 / 2 )


• Son aquellas variables cuyos nombres son números
• Estas referencian a los argumentos de los comandos
˘ ˇ

$ find / -name programa.c

Nombre comando = find ↔ 0


1er argumento = / ↔ 1
2do argumento = -name ↔ 2
3er argumento = programa.c ↔ 3
Más argumentos 4, 5, ..., {10}, {11}
Diego

• Observaciones:
2008-11-03 15:51:09
--------------------------------------------
- basename 0: nombre del comando
- dirname 0: path al nombre del comando
- s ift: rota los argumentos hacia la izquierda i › {i+1}, 0 no
cambia
P uede tom ar un núm ero n com o argum ento, así los parám etros
n+1... # se renom bran a 1.. #-(n+1)
Capacitación ® 2005 KIT Ingeniería Electrónica SRL 40
Diego
2008-11-03 15:43:34
--------------------------------------------

Parámetros posicionales o argumentos ( 2 / 2 )


• Variables argumento especiales
#: cantidad de argumentos pasados al comando
Ł ˘ ˇ ˇ
” *”: todos los argumentos ” *”=” 1 2 3...”, una sola palabra
formada por los parámetros separados por el 1er carácter en IFS
” @”: todos los argumentos ” @”=” 1” ” 2” ” 3”..., separadas por '

'
_: com ando previo
-: flags pasadas al script
: pid del proceso shell
!: pid del último trabajo ejecutándose en background
?: exit status
Diego
• * y @ difieren sólo cuando estan encerradas entre comillas dobles
2008-11-03 15:51:11
--------------------------------------------

• Nota: Estas variables son read-only


• El com ando readonly establece com o read-only a las variables
• Ejemplo:
$ FRUTA=kiwi
$ readonly FRUTA
$
$
echo
F R U
$FRUTA
TA=durazno # P rI oIdnguecnieaíereErlrecortrócnai SRL 42
Capa cit ac ió n ® 20 05 K T
Diego
2008-11-03 15:43:40
--------------------------------------------

Variables enteras
• Las variables enteras en Bash son enteros con signo (32 bits)
˘ ˇ

• Posibilidad de overflow

• Bash por sí mismo no comprende la aritmética de punto flotante

• Bash considera a los números conteniendo punto decimal como


cadenas

• Utilizar el lenguaje bc en los scripts si es necesario realizar cálculos


de punto flotante o emplear funciones matemáticas de bibliotecas

Diego
• Ejemplos:
$ echo
2008-11-03 15:51:14 "2.35 + 56.90" | bc
--------------------------------------------
→ 59.25
$ echo "sqrt(2)" | bc → 1
$ echo "sqrt(2.0)" | bc → 1.4
$ echo "sqrt(2.00000000)" | → 1.41421356
bc
• Nota: Veremos posteriormente más capacidades de bc

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 43


Diego
2008-11-03 15:43:43
--------------------------------------------

Arrays
• Un array es una serie de casillas, cada una conteniendo un valor
• Casilla V elemento, los elementos se acceden mediante
˘ ˇ
índices
• Los índices comienzan en 0 hasta más 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 vacíos explicitament mediante
Diego $ declare -a colores
2008-11-03 15:51:17
• 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[*]}
Capacitación ® 2005 KIT Ingeniería Electrónica SRL 44
Diego
2008-11-03 15:43:47
--------------------------------------------

Comando set
• El comando set despliega las variables de shell junto a sus
˘
valores
ˇ

• Permite definir el comportamiento del bash (opciones)

• Sintaxis:
set [-abdef kmntuvxBCHP] [(-|+)o opcion] [argumento...]

-n Lee comandos pero no los ejecuta, útil para depurar sintácticamente scritps
-v Muestra las líneas de entrada del shell tal cual son leídas
-x Muestra una traza de un comando y sus argumentos luego de aplicar expansiones

Diego

• Su uso habitual en shell scripts es para establecer los


2008-11-03 15:51:19
--------------------------------------------
parámetros posicionales
set `date`
ec o Hora actual: 4
Hora actual: 08:40:25

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 47


Diego
2008-11-03 15:43:52
--------------------------------------------

Comando getopts
• bash provee getopts para tratar con opciones m últiples y
com plejas
˘ ˇ
• puede utilizarse como una condición en un bucle w ile, dada la
especificación del formato de opciones (validez y argumentos), en
el cuerpo del w ile se procesan
• Sintaxis:
getopts cadena variable
- cadena conteniendo letras (opciones) y :'s (argumentos)
- variable que almacena el argumento de la opción que está
analizándose

• Ejemplo:
Diego
while getopts ":ab:c" opt;
do case $opt in
2008-11-03 15:51:21
--------------------------------------------
a.) procesar la opción
-a ;;
b.) procesar la opción
-b
OPTARG es el argumento de la
opción ;; c ) procesar la opción -c ;;
\? ) echo 'usage: alice [-a] [-b barg] [-c]
Capacitación args...' exit ®12005 KIT Ingeniería Electrónica SRL 48
Diego
2008-11-03 15:43:57
--------------------------------------------

Módulo 4
˘ ˇ

Operadores
Diego
2008-11-03 15:51:24
--------------------------------------------

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 50


Diego
2008-11-03 15:44:02
--------------------------------------------

El comando test
• Evalúa una expresión condicional
˘
$ test Łopcion expresion
ˇ
• test retorna un 0 (true) o un 1 (false) luego de la evaluación
• Una manera más 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 más familiar para los programadores
$ [ -f /etc/passwd && -f /etc/group ] # no
aceptado
$ [[ -f /etc/passwd && -f /etc/group ]] # ok
• Las construcciones ((...)) y let... evalúan ex presiones
aritméticas y retornan 0 (true) si el resultado es distinto de cero
y 1 (false) en caso contrario
$ ((1 > 2))
$ let 1 > 2

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 51


Diego
2008-11-03 15:44:06
--------------------------------------------

true y
• TRUE
false
- true: com ando que retorna siem pre un exit status ex itoso
˘ ˇ
(cero)
sin hacer nada
true
ec o ?
0
- También evalúan a true: 0, 1, -1, “abc”.

• FALSE
- false: comando que retorna siempre un exit status no exitoso
(distinto de cero) sin hacer nada
false
ec o ?
1
- También evalúan a false: NULL, variable no inicializada,
variable nula.

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 52


Diego
2008-11-03 15:44:10
--------------------------------------------

Asignación y Operadores aritméticos


• variable=asignacion
˘
Inicializa o cambia el valor de una variable
ˇ
Funciona tanto para enteros como para cadenas
• Advertencia: No confundir con el operador de
comparación =
$ var=27
$ animal=tigre # Sin espacios
entre el signo =
+ suma
• Operadores- aritméticos
resta
* producto
/ cociente
** exponenciación
% módulo o mod
+= más-igual
-= menos-igual
*= por-igual
/= dividido-igual
%= módulo-igual

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 54


Diego
2008-11-03 15:44:14
--------------------------------------------

Operadores de bits
cc left s ift (multiplica por
˘
cc=
ˇ
2) left-s ift-igual
$ let "var cc= 2" #
como un producto de 2^n
SS
SS= rig t s ift (divide por 2)
$ let
rig "var SS= 3" (inverso
t-s ift-igual # como una división de
2^n
de cc=)
& and
&= and-igual
| or
|= or-igual
- negación
! negación
^ xor (o-exclusivo)
^= xor-igual
$ var1=24 # 00000000 00000000 00000000 00011000
$ var2=10 # 00000000 00000000 00000000 00001010
$ let "var1 &= var2"
$ echo $var1
8
Capacitación ® 2005 KIT Ingeniería Electrónica SRL 55
Diego
2008-11-03 15:44:17
--------------------------------------------

Operadores de comparación de enteros


JCL
-eq es igual a [ " a" -eq " b" ] EQ
˘
-neˇ es distinto a [ " a" -ne " b" ] NE
-gt es mayor que [ " a" -gt " b" ] GT
S es mayor que ((" a" S " b"))
-ge es mayor o igual que [ " a" -ge " b" ] GE
S= es mayor o igual que ((" a" S= " b"))
-lt es menor que [ " a" -lt " b" ] LT
c es menor que ((" a" c " b"))
-le es menor o igual que [ " a" -le " b" ] LE
c= es menor o igual que ((" a" c= " b"))
• Ejemplos:
var1=21; var2=22
((" var1" c= " var2"))
ec o ?
0
[ " var1" -le "
var2" ]
ec o ?
0
((" var1" S " var2"))
ec o ?
1
Capacitación ® 2005 KIT Ingeniería Electrónica SRL 56
Diego
2008-11-03 15:44:20
--------------------------------------------

Operadores de comparación de cadenas


= es igual [ " a" = " b" ]
== a es [ " a" == "
˘!= ˇ es distinto
igual a a [ "] a" != "
b"
c b" menor
es ] en orden lexicográfico
[[ " a" c " b" ]]
[ " a" \c " b" ]
S es mayor en orden lexicográfico
[[ " a" S " b" ]]
[ " a" \S " b" ]

• Nota: "c" y "S" necesitan ser escapados dentro de


[]
{#var} retorna la longitud del valor de var
expr lengt var idem
expr " var" :
'.*' idem
-z la
-n cade
na
• Nota: veremos detallesesdel comando expr más
adelante "null
"
Capacitación ® 2005 KIT Ingeniería Electrónica SRL
(tien 58
Diego
2008-11-03 15:44:24
--------------------------------------------

Condiciones sobre archivos


-e existe el arc ivo
˘
-fˇ es un arc ivo regular
-r tiene permiso de lectura
-w tiene permiso de
-x escritura tiene permiso
-s de ejecución
-d no tiene cero bytes (no es
-b vacío) es un directorio
-c es un block device (floppy, sound card)
-p cdrom)
- es un c aracter device (keyboard,
-L modem, es un pipe nominado (FIFO)
-S es un ard link
-O es un symbolic
-G link es un socket
-N soy el propietario
del arc ivo?
el GID del arc ivo es igual al mío?
se modificó desde su última
lectura?
f1 -nt f2 £n es más nuevo que £2, em re1acióm a actua1i£acióm
1a
f1 -ot f2 £n es más viejo que £2, em re1acióm a 1a actua1i£acióm
f1 -ef f2
Capacitación £n y £2 son® 2005
ardKIT
links al Electrónica
Ingeniería mismo arc SRL ivo 59
test, retorna
Diego
2008-11-03 15:44:27
--------------------------------------------

Operadores lógicos
• negación !expr
˘
• and
ˇ
lógico expr1 &&
• or lógico expr2 expr1
• asociatividad || expr2
( expr )
• Ejemplos: utilizado para
ec o -n “Hola”forzar
&& ec o “
evaluación
Mundo”
Hola Mundo
false && ec o “ Mundo”
(nada, evalúa a 1)
true && ec o “ Mundo”
Mundo
ec o -n “Hola” || ec o “ Mundo”
Hola
false || ec o “ Mundo”
Mundo
true || ec o “ Mundo”
(nada, evalua a 0)

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 60


Diego
2008-11-03 15:44:31
--------------------------------------------

Operadores misceláneos
• Operador coma
- Permite encadenar dos o más operaciones aritmética
˘ ˇ

- Se evalúa cada operación (con posibles efectos laterales), pero


sólo se retorna la última operación
- Similar al operador coma de C

• Ejemplos:
let "t1 = ((5 + 3, 7 - 1, 15 - 4))"
ec o "t1 = t1"
t1 = 11

let "t2 = ((i = 9, 15 / # se establece i (efecto


3))" lateral)
ec o "t2 = t2 i = i"
t2 = 5 i = 9

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 61


Diego
2008-11-03 15:44:36
--------------------------------------------

Módulo 5
˘ ˇ

Construcciones
condicionales

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 62


Diego
2008-11-03 15:44:42
--------------------------------------------

Sentencia if ( 1 / 3 )
• Sintaxis:
if
˘ ˇ
condición1 ;
t en
elifcomandos1 # / \
condición2 ; t # | |
en # | Esto es opcional
comandos2 #
| | |
else # \ /
fi coman
• Realiza
dos3
acciones (ejecutacomandos) dependiendo del valor
de verdad de una condición (un comando)
• elif es una abreviatura de elseif
• Las condiciones evaluan valores de variables, características
de archivos, si un comando se ejecuta o no correctamente, etc
• Ejecución:
1. Se evalúa condición1
2. Si su exit code es 0, se ejecutan los comandos1 y termina el if
3. De otra manera se evalúa condición2
4. Si su exit code es 0, se ejecutan los comandos2 y termina el if
5. En caso contrario se ejecutan los comandos3 y termina el if
Capacitación ® 2005 KIT Ingeniería Electrónica SRL 63
Diego
2008-11-03 15:44:47
--------------------------------------------

Sentencia if ( 2 / 3 )
• Errores comunes:
- Omitir el punto y coma (;) antes de la sentencia t en al escribir el
˘ ˇ
if de m anera lineal
if condicion; t en comandos1 else comandos2 fi
- Utilizar elseif en lugar de elif
- Om itir la sentencia the t en cuando se utiliza la sentencia elif
- Escribir if en lugar de fi al cerrar el cuerpo del if
• Ejemplos:
if grep saldo clientes > /dev/null # grep -qs saldo clientes
t en
echo "clientes contiene al menos una ocurrencia de saldo."
elif grep deuda clientes > /dev/null
echo "clientes contiene al menos una ocurrencia de deuda."
else
echo "Las palabras saldo y deuda no estan presentes en
clientes"
fi

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 64


Diego
2008-11-03 15:44:50
--------------------------------------------

Sentencia if ( 3 / 3 )
• Ejemplos:
#!/bin/bash
˘
xusers=`who
ˇ
| wc -
l`

if [ $xusers -gt
1 ] ;
t en
echo "Sólo
"Hay Ud. está conectado"
fi más de un
usuario
conectado"
var1=21
else
var2=22 echo "$var1 no es igual a $var2"
[ "$var
1" -ne
"$var2"
] &&
# El lo mismo que
if [ "$var1" -ne ;
"$var2" ] then
echo "$var1 no es a $var2"
igual
Capacitación
fi ® 2005 KIT Ingeniería Electrónica SRL 66
Diego
2008-11-03 15:44:55
--------------------------------------------

Sentencia case ( 1 / 2 )
• Sintaxis:
case palabra in
˘ ˇ
patron1)comandos1 ;;

patron2)comandos2 ;;
....
# el patron *) es
(opcional) y se
utiliza como
“default”
esac
• palabra es comparada frente a cada patron hasta que se
encuentre una coincidencia o estos se acaben
• se ejecutan sólo los comandos asociados con el patron
coincidente en caso que esté presente el ;; y luego se sale del
case, en caso contrario se ejecutarán los comandos del patron
inferior, etc...
• Los ;; hacen las veces del break de C
• Un patron es una cadena consistente en caracteres
com unes y metacaracteres
•Capacitación
No existe límite para ®la2005
cantidad máElectrónica
KIT Ingeniería x ima deSRL
patrones aunque el 67
Diego
2008-11-03 15:45:00
--------------------------------------------

Sentencia case ( 2 / 2 )
• 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
calorías."
fi
banana) echo "La banana es rica en
# Con caseecho
kiwi) "El kiwi
potasio." ;; provee vitamina C." ;;
manzana)
case $fruta in "La manzana es baja en
echo
esac calorías." ;;

# 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
Capacitación ® 2005 KIT Ingeniería Electrónica SRL 68
Módulo 6

Construcciones iterativas
o de repetición

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 70


Diego
2008-11-03 15:45:04
--------------------------------------------

Sentencia for
• Es la construcción de iteración básica
˘
• Sintaxis:
ˇ
for arg in lista ;
do
comando(s)...
done
• En c/iteración arg
toma valores de lista
y se
ejecutancomando(s)..
.
• lista puede contener
metacaracteres
for i in oja*
• Los elementos en
lista pueden tener
argumentos
• Si do está en la misma
línea que for es
necesario el punto y ® 2005 KIT Ingeniería Electrónica SRL
Capacitación 71
Diego
2008-11-03 15:45:08
--------------------------------------------

Sentencia select ( 1 / 2 )
• Sintaxis:
select name [in lista]; # los [] están indicando
˘ ˇ
do opción
comando(s)... # no es parte de la sintaxis
done
• Provee una manera simple de crear menús numerados para que
los usuarios seleccionen una de las opciones en lista
• Introducido por ks posteriormente incorporado por bas
• Ejecución:
1. Se muestra cada elemento de lista acompañado de un número
2. Se muestra el prompt PS3, generalmente es #?
3. Cuando el usuario ingresa un valor se almacena en REPLY
4. Si REPLY contiene un núm ero válido, name se establece a la
variable asociada a dicho número.
Si REPLY contiene un número NO válido, name será nula.
Si se ingresa una línea vacía se muestra lista y el prompt
nuevamente. En caso de EOF, se finaliza el select.
5. Se ejecutan los comando(s)... en los primeros dos casos.
6. Si no se utiliza ningún mecanismo de control de bucles se continúa
con el paso 1
Capacitación ® 2005 KIT Ingeniería Electrónica SRL 72
Diego
2008-11-03 15:45:14
--------------------------------------------

Sentencia select ( 2 / 2 )
• Ejemplo:
#!/bin/bash
˘ ˇ
PS3='Elija su comida favorita: ' # Establece el
prompt echo
select food in "Asado" "Lasagna" "Paella" "Pizza"
do
[ -e "$food" ] && continue
echo "Su comida favorita es $food."
break
done
exit 0

• Nota: Si se omite lista, select utilizará los argumentos pasados


al script ( @), o a la función que contiene el select

• Nota: Más adelante, en este mis mo módulo veremos el significado


de break y continue

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 74


Diego
2008-11-03 15:45:18
--------------------------------------------

Sentencia w ile ( 1 / 2 )
• Sintaxis:
w ile comando ; # comando ≈ condición ≈ comando
˘ ˇ
do test
comando(s)..
done .
• Se ejecuta mientras que la condición sea verdadera
• Para repetir comando(s)... un número de veces no
preestablecido
• Ejecución:
1. Se ejecuta comando
2. Si el exit status de comando es distinto de cero, finaliza el w ile
3. Si el exit status de comando es cero, se ejecuta comando(s)...
4. Cuando finaliza comando(s)... se retorna al paso 1
• Sintaxis in-line: w ile comando ; do comando(s)... ;
x=0 done
# SALIDA #
• while [ $x -lt
Ejemplo: 0123456789
10 ] do
echo -n $x
x=$(( $x +
1 ))
done
Capacitación ® 2005 KIT Ingeniería Electrónica SRL 76
Diego
2008-11-03 15:45:23
--------------------------------------------

Sentencia w ile ( 2 / 2 )
• Bucles anidados
w ile # bucle principal
˘ ˇ
condición1 ;
do
comandos... # bucle
w ile condición2 ; anidado
do
comandos...
done
comandos...
done
• No hay restricciones relacionadas con el nivel de anidación
x=0 # SALIDA #
while [ "$x" -lt
0
10 ] ; do
y="$x"
while [ "$y" -ge
0 ] ; do
echo "$y \c"
y=$(( $y - .
1 )) .
done
echo $x .
x=$(( $x +
1 )) done
Capacitación ® 2005 KIT Ingeniería Electrónica SRL 77
9
Diego
2008-11-03 15:45:28
--------------------------------------------

Sentencia until
• Sintaxis:
˘
until comando ;
ˇ
# comando ≈ condición ≈ comando
do test
comando(s)..
done.
• Se ejecuta hasta que la condición sea verdadera
• Es la “negación” del bucle w ile
• Ejecución:
1. Se ejecuta comando
2. Si el exit status de comando es cero, finaliza el until
3. Si el exit status de comando no es cero, se ejecutan
comando(s)...
4. Cuando finalizan los comando(s)... se retorna al paso 1
• Sintaxis in-line: until comando ; do comando(s)... ; done
• Ejemplo: x=1
until [ $x -gt # w ile [ ! $x -gt
10 ] do 10 ]
echo -n $x
x=$(( $x +
1 ))
done
Capacitación ® 2005 KIT Ingeniería Electrónica SRL 78
Diego
2008-11-03 15:45:32
--------------------------------------------

Comandos break y continue


• Existe el riesgo de escribir bucles infinitos
x=0
˘ ˇ
while [ x -lt # Error, va
10 ] do x !!!
echo $x
x=$(( $x +
done1 ))
• break finaliza el bucle que la contiene
• continue provoca un salto hasta la próx im a iteración, saltando
el resto de los comandos de la iteración actual
• ambas construcciones pueden eventualmente tomar un
parámetro numérico, break N V finaliza los bucles hasta el nivel N
de anidación
• Ejemplo:
while :
do
read CMD
case $CMD
in
[qQ]|
[qQ][uU]
[iI]
Capacitación [tT]) ® 2005 KIT Ingeniería Electrónica SRL 80
Diego
2008-11-03 15:45:36
--------------------------------------------

Módulo 7
˘ ˇ

Funciones

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 82


Diego
2008-11-03 15:45:39
--------------------------------------------

Introducción
• Las funciones mejoran la programación de shell scripts:
- Cuando se invoca una función, la mis ma estará
˘ ˇ
previamente cargada en memoria → velocidad de
ejecución
- Modularización, depuración, reutilización de código
• Es una implementación limitada respecto a otros lenguajes
• Necesariamente deben estar definidas antes de su
invocación
• Dentro de una función 1, 2, 3,... serán los parámetros pasados a
function no al script en sí {
la misma,nombre_funcion nombre_funcion () {
• Sintaxis
comando...
permitidas: comando...
} }
• Ejemplo:
#!/bin/bash
saludo () {
echo -n “Hola ”
}
saludo
echo “Mundo”
Capacitación ® 2005 KIT Ingeniería Electrónica SRL 83
Diego
2008-11-03 15:45:43
--------------------------------------------

Variables locales y globales


• Una variable es considerada como local si sólo es visible dentro
del bloque de código en el cual aparece, es decir tiene alcance
˘ ˇ
(scope) local. En el caso de funciones las variables locales sólo
tienen significado dentro de la función.

• var1 es visible tanto para sript


com o para funcion. Es una variable
global
• 0, 1, 2 son visibles sólo para sript
• 1 y 2 son visibles sólo para funcion

• Nota:
funcion puede definir una variable
local
denominada var1, pero debe anteponer
la palabra reservada local
local var1

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 84


Diego
2008-11-03 15:45:47
--------------------------------------------

Visibilidad y definiciones
• las declaraciones de funciones pueden aparecer en casi
cualquier lugar, inclusive donde iría un comando
˘ ˇ
ls -l | f () { ec o "22"; } # Correcto, aunque inútil

• bash admite funciones anidadas


#!/bin/bash
f1 () {
f2 () { # funcion anidada
echo "Funcion \"f2\", dentro de \"f1\"."
}
}

f2 # Provoca un error

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 86


Diego
2008-11-03 15:45:55
--------------------------------------------

Modularización y terminación
• Con source o con “.” podemos incluir el código de otro script en el
nuestro:
˘ ˇ
#!/bin/bash
source funciones.sh # en funciones.sh se define suma
suma 1 3
suma 12 12312

• exit y retrun
- exit status
Es el valor que retorna la función.
Puede ser especificado explícitamente por retrun, de otra manera será el
exit status del último comando ejecutado. Se obtiene su valor mediante
$?
- retrun [n]
Termina una función, el argumento entero opcional es retornado al script
invocante como el exit status de la función y se asigna a $?

• Nota: El entero positivo más grande que una función puede retornar es
255 Las versiones superiores a 2.05b del bash no sufren de esta limitación.
Capacitación ® 2005 KIT Ingeniería Electrónica SRL 87
Diego
2008-11-03 15:45:59
--------------------------------------------

Terminación ejemplo
#!/bin/bash
# Verificando el valor del máximo 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 (código “error miscelaneo”)

Alternativa: uso de variable global


Return_Val= # Variable global para almacenar el valor de
retorno
alt_return_test () {
Return_Val=$1
return # Returns 0 (success).
}
alt_return_test 256
echo "return value = # 256
Return_Val"

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 88


Diego
2008-11-03 15:46:03
--------------------------------------------

Módulo 8
˘ ˇ

Entrada y Salida
Redirecciones

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 90


Diego
2008-11-03 15:46:07
--------------------------------------------

Introducción
• '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
• Cuando se ejecuta un comando se abren y asocian con el mis mo tres
archivos representados por números bajos (file descriptors)
STDOUT (1)
STDIN (0)
Comando STDERR (2)

• Se puede asociar cualquier archivo con descriptores de


archivos mediante el comando exec (facilitar la referencia)

exec 4Scapitulo4.txt

• bash ofrece muchos operadores de redirección

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 91


Diego
2008-11-03 15:46:11
--------------------------------------------

Interacción con el usuario ( 1 / 3 )


• read
˘
● Sintaxis:
ˇ
read [-a aname] [-p prompt] [-er] [variable...]
● Lee el valor de una variable desde STDIN
● Con la opción -a permite leer variables tipo array
● Ejemplos:
#!/bin/bash
echo -n "Ingrese su nombre: "
read name
echo "name = $name"

echo -n "Ingrese su fecha de nacimiento (dd mm aaaa): "


read dia mes anyo

● Un read sin v ariable(s) asociada(s) provoca que se establezca


REPLY
● Algunas
-t Entrada
opciones temporizada
de read
-p Permite establecer un prompt para guiar la entrada
prompt Aceptar sólo N caracteres de la entrada
-n N
Capacitación ® 2005 KIT Ingeniería Electrónica SRL 92
Diego
2008-11-03 15:46:15
--------------------------------------------

Interacción con el usuario ( 2 / 3 )


• ec o

˘ Sintaxis:
ˇ

ec o [-neE] [arg...]
● Imprime texot por STDOUT
● Por defecto imprime un carácter nueva-linea, con -n se
suprime
● Con la opción -e interpreta caracteres especiales
\b Backspace
\c Suprime nueva-linea
\f Formfeed
\n nueva-linea
\r Retorno de carro
\t Tabulador
\\ Backslash
\nnn Caracter cuyo valor ASCII es el octal nnn
● Ejemplos:
a=`ec o "HOLA" | tr A-Z a-z`
ec o a
hola
ec o -e "Nueva \nLinea"
Nuev
Capacitación ® 2005 KIT Ingeniería Electrónica SRL 94
a
Diego
2008-11-03 15:46:19
--------------------------------------------

Interacción con el usuario ( 3 / 3 )


• printf
● Sintaxis:
˘ ˇ
printf cadena-de-formato... [parametro...]
● Es una mejora a ec o, versión limitada de la función printf() de
C
● 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

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 95


Diego
2008-11-03 15:46:22
--------------------------------------------

Tabla de operadores de redirección ( 1 / 2 )


cmd1 | Pipe, toma STDOUT de cmd1 como STDIN del cmd2
˘ ˇ
cmd2 S STDOUT a arc , si arc existe lo
arc reemplaza Toma STDIN desde arc
c arc STDOUT a arc , escribe al final si arc
existe
SS arc
S| arc Fuerza STDOUT a arc aun si noclobber está

nS| arc establecido Idem para el archivo cuyo descriptor de

cS arc archivo es n
Usa arc como STDIN tanto como STDOUT
ncS arc
Usa arc como STDIN tanto como STDOUT para el
cc label
descr. arch n
nS arc
Here document
nc arc
Direcciona el descriptor de archivo n a arc
nSS
Tom a el descriptor de archivo n desde arc
arc
Direcciona el descriptor de archivo n a arc , agrega datos al
Capacitación final de arc siKIT
® 2005 ya Ingeniería
existe Electrónica SRL 96
Diego
2008-11-03 15:46:26
--------------------------------------------

Tabla de operadores de redirección ( 2 / 2 )


nS& Duplica STDOUT del descriptor de archivo n
˘ ˇ
nc& Duplica STDIN del descriptor de archivo n
nS&m El descriptor de archivo n se transforma en una copia
del descriptor de archivo de salida m
nc&m El descriptor de archivo n se transforma en una copia
del descriptor de archivo de entrada m
&Sarc Direcciona STDOUT y STDERR a arc
c&- Cierra STDIN
S&- Cierra STDOUT
nS&- Cierra STDOUT
del descriptor
de archivo n
nc&-
Cierra STDIN
del descriptor
de archivo n

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 98


Diego
2008-11-03 15:46:30
--------------------------------------------

Ejemplos
cat SS .bas rc
alias ll='ls -lha'
˘ alias
ˇ rm='rm -i'
^D

cat c arc ivo1 S


arc ivo2
# similar a cp
archivo1 archivo2

lpr cc MIS_URLS
http://sun.sunsolve.com
http://docs.sun.com
http://www.sunfreeware.com

MIS_URLS

ec o “Mensaje” 1S&2
Capacitación ® 2005 KIT Ingeniería Electrónica SRL 99
Diego
2008-11-03 15:46:34
--------------------------------------------

Módulo 9
˘ ˇ Ł

Herramientas

misceláneas

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 100


Diego
2008-11-03 15:46:37
--------------------------------------------

Introducción
• Herramientas útiles para la confección de scrpits
˘ ˇ Ł
• Comandos propios del shell (built-in)
eval
: (dos puntos)
type

• Comandos externos
sleep
find

xargs
expr
bc

• Los comandos built-in se ejecutan de manera más eficiente que los


externos pues no existen accesos a disco para su ejecución

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 101


Diego
2008-11-03 15:46:41
--------------------------------------------

Comando eval
• Puede utilizarse cuando se desea que el shell reprocese la línea
de comandos por segunda vez
˘ ˇ Ł
• Sintaxis:
eval cualquier_comando

• 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 líneas que comiencen con eval y contengan $SALIDA

• Útil para el caso en que se desea componer una línea de


comandos utilizando metacaracteres contenidos en variables o
producidos debido a sustitución de comandos
Capacitación ® 2005 KIT Ingeniería Electrónica SRL 102
Diego
2008-11-03 15:46:44
--------------------------------------------

Comando :
• No hace nada, retorna 0 indicando ejecución de comando exitoso
• Puede utilizarse con seguridad en cualquier lugar donde se requiera
˘ ˇ Ł
un comando por cuestiones puramente sintácticas
• Ejemplos:
if [ -x
$CMD ] then
:
else
e
c
h
o

E
r
r
o
r
:

$
C
M
Capacitación
D ® 2005 KIT Ingeniería Electrónica SRL 103
Diego
2008-11-03 15:46:49
--------------------------------------------

Comando type
• Brinda el path absoluto de uno o más comandos
˘
• Sintaxis:
ˇ Ł
type comando...

• Si comando no es un com ando ex terno 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 también 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
Capacitación ® 2005 KIT Ingeniería Electrónica SRL 104
Diego
2008-11-03 15:46:53
--------------------------------------------

Comando sleep
• Provoca una pausa por un número determinado de segundos
• Sintaxis:
˘ ˇ Ł
sleep n
• Algunos tipos de UNIX perm iten otras unidades de tiem po
• 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
=========
=========
=========
=========
==
Capacitación
date ® 2005 KIT Ingeniería Electrónica SRL 106
Diego
2008-11-03 15:47:03
--------------------------------------------

Comando find ( 1 / 2 )
• Comando muy poderoso, provee un mecanismo muy flexible
para crear una lista de archivos que verifican ciertos criterios
˘ ˇ Ł
• Sintaxis:
find directorio_partida opciones acciones

• Ejemplos:
$ find / -name core - # -print es considerado por
print defecto
$ find / -name '*core*' # * ? [caracteres] [!
$ find / -type d # 2000 bloques de 512
caracteres]
$ find -mtime+2000
/ -size -5 bytes
+n Modificados hace más de n días atrás
n Modificados exactamente hace n
-n días Modificados hace menos de n
días
-mtime ↔ Modificación
-atime ↔ Acceso
-ctime ↔ Creación, permisos,
propiedad

$ find / -atime +100 -exec rm -i {} \;

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 107


Diego
2008-11-03 15:47:08
--------------------------------------------

Comando find ( 2 / 2 )
• Combinación de criterios
- And
˘
$ ˇfind Ł / -size +50 -mtime -3 -
print # se ignora -mtime -
$ find / -size +50 -print -mtime - 3
-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 xargs com o en
$ find / -name core | xargs rm -i
Este comando también borra los archivos core pero mucho más
rápido y con menos sobrecarga que -exec que llama rm -i para
cada archivo

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 108


Diego
2008-11-03 15:47:13
--------------------------------------------

Comando xargs
• 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 número de archivos es demasiado grande xargs ejecuta rm
varias veces
• Puede especificarse cuantos argumentos de STDIN serán
procesados como argumentos para el comando mediante la opción
-n
$ cat lista_archivos | xargs -n 20 rm # borrar 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 '^a' |® xargs
Capacitación 2005 KIT-n 20 rm
Ingeniería Electrónica SRL 110
Diego
2008-11-03 15:47:17
--------------------------------------------

Comando expr
• Útil para realizar operaciones aritméticas enteras simples
˘ en
ˇ notación
Ł infija
• Sintaxis:
expr operando1 operador operando2
• Operadores:
+ Suma
- Resta
\* Multiplicación (operador quoted)
/ División entera
% Resto de la división
• expr requiere espacios para separar sus argumentos
• Ejemplos:
expr 3 + 2
5
expr “ABRIL” : '[A-G]*'
2
[email protected]
[ expr " mail" : '.*' -eq expr " mail" :
'.*@.*\..*']

//En scritps CNT=´expr CNT + 1´


Capacitación ® 2005 KIT Ingeniería Electrónica SRL 111
Diego
2008-11-03 15:47:20
--------------------------------------------

Comando bc
• Potente utilidad para realizar cálculos numéricos 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
* Multiplicación (operador quoted)
/ División entera
% Resto de la división
^ Exponenciación

•Opera de manera precisa con números de cualquier tamaño


9238472938742937 * 29384729347298472
271470026887302339647844620892264

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 112


Diego
2008-11-03 15:47:24
--------------------------------------------

Comando bc
• Usos típicos en scripts
AVERAGE=´echo "scale=4; $PRICE/$UNITS" | bc
˘ ṔI=
ˇ (echo
Ł "scale=10; 4*a(1)" | bc - # a: atan(x)
l) # -l:
mathlib
• Permite realizar conversiones en diferentes bases
Es importante establecer primero la base output
$ bc
obase=16 # base output =
ibase=8 hexadecimal # base input
400 = octal
100
77
3f
10*3
18
quit

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 114


Diego
2008-11-03 15:47:28
--------------------------------------------

Módulo 10
˘ ˇ Ł

Filtros

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 115


Diego
2008-11-03 15:47:31
--------------------------------------------

Filtros
• Comandos que leen alguna entrada, realizan una transformación de
˘
laˇ misŁma o calculan valores mediante esta y escriben alguna salida

• Comandos de filtrados típicos


- sort: Ordena Iíneas de archivos de texto (sort -k, sort -f)
- tr: Traduce o eIimina caracteres (trabaja con STDIN)
- uniq: EIimina Iíneas dupIicadas en un archivo ordenado (sort -u)
- ead: Muestra Ias primeras Iíneas de un fichero
- tail: Muestra Ias úItimas Iíneas de un fichero
- wc: Estadísticas simpIes para archivos de texto
- rev: Invierte cada Iínea de una archivo y Ia envía a STDOUT
- cat: Concatena eI contenido de uno o más archivos (cat -n)
- cut: Imprime partes seIeccionadas de Ios archivos de entrada
(cut -b)

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 116


Diego
2008-11-03 15:47:35
--------------------------------------------

Módulo 11
˘ ˇ Ł

Lenguaje awk

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 118


Diego
2008-11-03 15:47:38
--------------------------------------------

Introducción
• Aho - Weinberger - Kernighan

• La versión original fue escrita en 1977 en los laboratorios AT&T


˘ ˇ Ł

• En 1985 se escribió una versión más potente


(funciones, expresiones regulares)

• awk es idóneo para obtener informes o resúmenes a partir de


“datos crudos” o de la salida de otros programas

• Está más relacionado a un lenguaje de programación (C) que a


un editor, como lo está sed

• Los programas awk son breves en general permitiendo su


fácil composición con otros comandos y programas

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 119


Diego
2008-11-03 15:47:42
--------------------------------------------

Generalidades
• Forma general
awk 'programa' arc ivo ...
˘ ˇ Ł

• Un programa awk consiste en una o más reglas de la


forma
patrón { acción } # Ias IIaves separan Ia acciones de Ios
patrón patrones
{ acción }
...
• P erspectiva awk de la
entrada
arc ivo = secuencia de líneas o
registros registros = secuencias de
campos
• awk consume cada arc ivo ... registro por registro analizando si
entre sus campos “está presente” el patrón, si es así se aplica la
acción sobre este registro
• awk es case sensitive
•Capacitación
awk N O altera al contenido de los arc ivo ...
® 2005 KIT Ingeniería Electrónica SRL 120
Diego
2008-11-03 15:47:45
--------------------------------------------

Primeros ejemplos
awk '/abc/ {print 0}' arc ivo
˘ ˇ Ł

• Nota: Barras / y comillas '


• El patrón o la acción pueden omitirse pero no ambos a la vez
- patrón omitido → se realiza la acción para cada línea
- acción omitida → la acción por defecto es replicar la línea

• Ejemplos:
awk '{print 0}' arc ivo Ξ cat arc ivo
awk '/abc/' arc ivo Ξ grep abc arc ivo

• Ejemplos más elaborados:


awk '/100/ {print 0}
/200/ {print 0}' cuotas_pagas impuestos
Nota: si en una línea aparece tanto 100 como 200 se imprimirá dos
veces!

ls -l | awk ' 6=="Jun" { sum+= 5 } END { print


sum }'
Capacitación ® 2005 KIT Ingeniería Electrónica SRL 122
Diego
2008-11-03 15:47:48
--------------------------------------------

Ejecución de programas awk


• En línea de comandos, eventualmente como parte de un pipeline
˘ ˇ
awk Ł 'programa' arc ivo…

• Como script
awk –f script.awk arc ivo…

• Sin archivos de entrada aplica el programa a la entrada


estándar (Ctrl-d) para terminar
awk 'programa' o awk -f sript.awk

• Como ejecutable
#! /bin/awk –f
# Primer script
BEGIN {print
“Hola Mundo”}

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 123


Diego
2008-11-03 15:47:54
--------------------------------------------

Sentencias y líneas
• Cada linea de un program a awk es una sentencia o regla
˘
indepen-
ˇ Ł
diente

• Una sentencia puede ocupar más de una línea dividiéndola


con nueva-línea detrás de alguno de los caracteres:
, { ¿ : || && do else
de otra manera la nueva-línea indicaría fin de sentencia

• Se puede cortar tam bién con el carácter \ en cualquier punto


awk '/oferta de fin de mes/ \
{print 0}' lista-precios

•El carácter ; se utiliza para colocar más de una sentencia en una


mis ma línea
awk '/100/ {print 0} ; /200/ {print 0}' impuestos

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 124


Diego
2008-11-03 15:47:58
--------------------------------------------

Interpretación de la entrada
• a w k consume la entrada en registros, divididos a su vez en campos
•˘ Con
ˇ las
Ł variables built-in se puede cambiar esto
- variable RS (Record Separator): separador de registros
awk 'BEGIN {RS=”/”}; {print 0}' fec as
//cambia RS antes de consumir entrada
- RS=”” indica que los registros serán separados por líneas en
blanco
- variable FS (Field Separator): separador de cam pos
-variable FNR: almacena la cantidad de registros leídos hasta el
momento del archivo actual, este valor se reinicia con cada archivo
- variable NR (Number of Records) guarda el número total de
registros leídos (no se reinicia automáticamente)
- 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
– ...
Capacitación ® 2005 KIT Ingeniería Electrónica SRL
– NF: Último campo del registro 126
Diego
2008-11-03 15:48:02
--------------------------------------------

Patrones ( 1 / 2 )
/expresión regular/
- El texto del registro de entrada concuerda con la expresión
˘ ˇ Ł
regular
- Ejemplos:
/texto/ Concordancia con texto
/x+/ Una o más ocurrencias de x
/x?/ Una o ninguna ocurrencia de x
/x|y/ Tanto x com o y
(string) Agrupa una cadena para usar con +
1 - o?
/exp- Concordancia de campo
reg/
expresión
-Vale cuando su valor es distinto de 0 (si representa un número) o no nulo (si
representa una cadena)
- expresión se evalua cada vez que la regla se chequea contra un nuevo
registro
- Puede ser una expresión de la forma N, que dependa del registro actual

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 127


Diego
2008-11-03 15:48:06
--------------------------------------------

Patrones ( 2 / 2 )
patron1, patron2
- Especifican un rango de registros
˘ ˇ Ł
- patron1 (patrón de inicio), patron2 (patrón de fin)
-Cuando un registro concuerda con patron1 comienzan a chequearse los
siguientes registros contra patron2, luego realiza la misma tarea desde el
ppio

$ awk ' 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 después de procesar la
entrada
- Tanto BEGIN como END se ejecutan sólo una vez
- No pueden ser usados en rangos o con operadores booleanos
-Deben estar acompañados 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 ® 2005 KIT Ingeniería Electrónica SRL
Capacitación 128
Diego
2008-11-03 15:48:10
--------------------------------------------

Operando con patrones


• Expresiones de comparación de patrones
x c y Verdad si x es m enor que y
˘ ˇ Ł
x c= y Verdad si x es m enor o igual que y
x S y Verdad si x es m ayor que y
x S= y Verdad si x es m ayor 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
ex presión regular y
x !- y Verdad si x no concuerda con la
ex presión regular y
• Operadores booleanos de patrones
! no
|| o
&& y
• Ejemplos:
awk '/100/ && /200/'
awk ' 1 == 5000 { print 1, 2}'
awk '! /100/'
awk '/sa/ || /srl/'

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 130


Diego
2008-11-03 15:48:14
--------------------------------------------

Acciones
• Una acción = una o más sentencias awk y se encierra entre llaves
˘
{}
ˇ Ł
• Las sentencias son separadas por caracteres nueva-linea o ;
• Tipos de sentencias
- Expresiones
Invocación de funciones, asignación de variables, variables y
funciones built-in
- Sentencias de control
Similares a las del lenguaje C: if, for, w ile, do-w ile, break,
continue
- Sentencias compuestas
Consisten en una o más sentencias encerradas entre llaves, bloques
- Control de entrada
getline y next
- Sentencias de salida
print y printf
- Sentencia de borrado
Para eliminar elementos
Capacitación deKIT
® 2005 unIngeniería
array Electrónica SRL 131
Diego
2008-11-03 15:48:18
--------------------------------------------

Sen ten cias print y printf


•(1/
Son 2)
de las más utilizadas como acción
˘ • ˇ printŁ
(item1, item2, ...) # los paréntesis son necesarios a veces
• print
* " @ " Ξ print
( ; C /
$0
• print ”” Ξ línea en blanco
• Separadores de salida
- OFS Output Field Separator (espacio por defecto)
- ORS Output Record Separator (nueva-linea por defecto)
• Ejemplos:
awk 'patron { print }' a_ent S a_sal
// $ grep patron a_ent > a_sal
awk 'BEGIN { print “linea uno\nlinea dos” }'
linea uno
linea
dos
date |
awk
'{ print
1, 2}'
Ene 14
date |
awk
'{ print
Capacitación ® 2005 KIT Ingeniería Electrónica SRL 132
Diego
2008-11-03 15:48:22
--------------------------------------------

Sen ten cias print y printf


•(2/ 2) formato item1, item2, ... # los ( ) son necesarios a veces
printf
˘ • formato
ˇ Ł es una cadena que indica como deben imprimirse los ítems
• es una versión inferior a la función printf() de C
• no coloca automáticamente un carácter nueva-linea al final
printf ”%f\n”, $2
• Ejemplos:
awk '{ printf “(%-10s, %d, %c)\t”, 1, 3, 4 }' inventario
awk 'BEGIN { format = ”%-10s %s\n”
printf format, “Nombre”, “Número”
printf format, “------”,
“------” }
{ printf format, 1, 2 }'
archivo_con_datos

• Redirecciones
awk '{ print 2 S “lista-telefonos”
print 1 S “lista-nombres” }'
archivo_con_datos

awk '{ print 1 S “nombres-desordenados”


print 1 | sort -r S “nombres-ordenados”
® 2005 KIT Ingeniería Electrónica SRL
Capacitación }' archivo_con_datos 134
Diego
2008-11-03 15:48:27
--------------------------------------------

“one-liners” útiles ( 1 / 2 )
• awk 'NF S 0' # sólo líneas no vacías
˘ ˇ Ł

• ls -l arc ivos |
awk '{ x += 4 } ; END { print "total bytes: " x }'
# cantidad de bytes ocupados en un directorio

• awk '{ if (NF S max) max = NF }


END { print max }'
# imprime el número máximo de
campos entre los registros

• - awk '{ nlines++ } ; END


{ print nlines }'
- awk 'END { print NR }'
# cantidad de líneas en
archivo(s), wc -l

• awk '{ print NR, 0 }'


# numera toda línea de entrada,
Capacitación
cat -n ® 2005 KIT Ingeniería Electrónica SRL 135
Diego
2008-11-03 15:48:31
--------------------------------------------

“one-liners” útiles ( 2 / 2 )
• awk 'BEGIN { FS = ":" }
˘ ˇ
{ print 1 | "sort" }' /etc/passwd
Ł
# imprime una lista ordenada de los nombres de usaurio

• awk 'lengt ( 0) S 80'


# imprime las líneas que contengan más de 80 caracteres

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 136


Diego
2008-11-03 15:48:35
--------------------------------------------

Ejemplos varios
• awk '{ i = 1 # imprime los primeros tres
w ile (i c= 3) campos # de cada registro
˘ ˇ Ł
{ print i
i++ # i=$i+1
}
}'

• awk '{ for (i = 1; i # idem anterior


c= 3; i++)
print i
}'
• Bash script con código awk embebido
#!/bin/bas

PASSWORD_FILE=/etc/passwd
n=1 # Numero de
usuario

for name in (awk 'BEGIN{FS=":"}{print 1}' c "


PASSWORD_FILE" ) do
ec o "USER # n =
name" let "n += 1"
done
Capacitación ® 2005 KIT Ingeniería Electrónica SRL 137
Diego
2008-11-03 15:48:39
--------------------------------------------

Módulo 12
˘ ˇ Ł

Lenguaje sed

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 138


Diego
2008-11-03 15:48:44
--------------------------------------------

sed
• Es un “editor de flujo” (stream editor)
• Deriva del editor ed
˘ ˇ Ł
• Consume cada línea de los archivos de entrada aplicando comandos
a las mismas, sin alterar a los mis mo
• Sintaxis:
sed opciones 'comando_ed' arc ivos…
• Nota: las comillas '' son generalmente indispensables debido a los
metacaracteres (evitar expansiones)
• Opciones:
-n : indica que se suprima la salida estándar
-e script : indica que se ejecute el script que viene a continuación.
Si no se emplea la opción -f se puede omitir -e.
-f archivo : indica que los comandos se tomarán de un archivo
• Los comandos son de la forma /patron/ accion
- patron es una ex presión regular
- accion es uno de los siguientes comandos (hay más)
p Imprime la linea
d Borra la linea
s/p1/p2/ Sustituye la prim er ocurrencia de p1 con p2
Capacitación ® 2005 KIT Ingeniería Electrónica SRL 139
Diego
2008-11-03 15:48:49
--------------------------------------------

Ejemplos de uso de sed


# Comportamiento por defecto: imprimir Ia entrada a STDOUT
sed kq Ξ ead -k # DeI ppio a Ia Iínea k -ésima
˘ ˇ Ł
sed -n '1p' arc ivo # DevueIve Ia 1er Iínea, -n sin eI texto
originaI
sed -n '4,6p' arc ivo # DevueIve Ias Iíneas 4 a Ia
6 Otra manera de hacer Io anterior: sed 10,20\!d
sed -n /^E/
'4, p' arc
arc ivo # DevueIve Ias
ivo todaIíneas
Iínea 4que
aI empieza con "E"
finaI
sed -nΞ '/^E/, p' arc # Desde Ia 1er Iínea que empiece con "E"
aI finaI
sed '3d'
tail -4 arc ivo # Borra Ia 3ra Iínea de arc
ivo sed 'a\Linea nueva' arc ivo
# Añade Ia Iínea con eI contenido "Linea
nueva" después de cada Iínea de arc ivo

sed '/0\.[0-9][0-9] /p' precios.txt


sed -n '/0\.[0-9][0-9] /p' precios.txt
sed '/^[Bb]lanco/d' colores.dat S colores-nuevo.dat

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 140


Diego
2008-11-03 15:48:53
--------------------------------------------

Ejemplos de uso de sed


• Sustituciones
˘ /patron/s/patron1/patron2
ˇ Ł
- patron1 es reem plaz ado por patron2 en toda línea que concuerde con
patron
- se realiza un reemplazo por línea (comportamiento por defecto)
- si se om ite patron se habilita el reem plaz o para todas las líneas
sed 's/Celeste/Celsete/' colores
- para realizar más de un reemplazo se utiliza g (global)
sed 's/mas/más/g' carta
- sólo el reemplazo tiene efecto en las líneas 1 a la 3
sed '1,3s/sa/SA/g' carta
- sustituciones homólogas: 1→x, 2→y, 3→z
sed 'y/[123][xyz]/g/' listado

- reutilizando una expresión regular


sed 's/ *[0-9][0-9]*\.[0-9][0-9] /\ &/' precios.txt

- comandos múltiples
sed -e 'comando1' -e 'comando2' ... -e 'comandoN' archivos
Capacitación ® 2005 KIT Ingeniería Electrónica SRL 141
Diego
2008-11-03 15:48:59
--------------------------------------------

Módulo 13
˘ ˇ Ł

Depuración de scripts
Ejercitación

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 143


Diego
2008-11-03 15:49:03
--------------------------------------------

Depuración de scripts (1-2)


• Debugging = detección y eliminación de problemas ligados a la
˘ ˇ
correctitud
Ł
(sintáctico-lógica) y el desempeño (performance)
• “Síntomas” de un script con errores:
- Arroja un error sintáctico, detiene su ejecución
- Se ejecuta, pero no trabaja como debería, error lógico
- Se ejecuta como era esperado, pero realiza efectos laterales
no deseados (bomba lógica)
• echo's es la primer opción, obviamente rudimentaria
■ TRAZA
• Comunmente se inicia un subshell con la opción -x establecida para
ejecutar un script en modo debug
bas -x script.s
Esto produce una “traza”, cada comando con sus argumentos en script.s
se imprimen por STDOUT, luego de realizar expansiones y antes de
ejecutarlos

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 144


Diego
2008-11-03 15:49:08
--------------------------------------------

Depuración de scripts (2-2)


• Opciones de debugging
set -f set -o noglob
˘ ˇ Ł
Desactiva generación de nombres de archivo usando metacaracteres (gIobbing)
set -v set -o verbose I
Imprime comandos Iuego de ejecutarIos. VisuaIizar que produjo Ia saIida
set -x set -o xtrace
Imprime Ia traza de Ios comandos antes de ejecutarIos
set -n set -o noexec
Lee comandos pero no Ios ejecuta. Detección de errores de sintaxis
set -u set -o nounset
Da mensajes de error aI intentar utiIizar variabIes no definidas
• Activ ar y desactiv ar m odos m ediante — y + respectivam ente
• Pueden establecerse opciones de debugging en parte de un script
set -x # activa debugging desde
aquí # comandos del script ...
set +x # desactiva debugging
desde aquí
# comandos del script ...

• Control de eficiencia mediante comando time

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 145


Diego
2008-11-03 15:49:12
--------------------------------------------

Ejercicios y Programas
• Nivel inicial
˘ - ˇ Interfaz
Ł para el comando cal
- Efectuar un backup (.tar.gz) de los archivos de su home que
no han sido modificados desde la última semana
- Imprimir todos los números primos entre 1 y 500
- Invertir el contenido de un archivo (tac)

• Nivel medio
- Interfaz (exhaustiva) para el comando cp

- Interfaz (exhaustiva) para el comando find


- Parseo del archivo /etc/passw y desplegar su contenido de
manera más fácil de leer
- Ecuación cuadrática ax2+bx+c=0

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 146


Diego
2008-11-03 15:49:17
--------------------------------------------

Módulo 14
˘ ˇ Ł

Conclusiones

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 147


Diego
2008-11-03 15:49:21
--------------------------------------------

Cuando NO utilizar shell scripts


• Tareas de uso intensivo de recursos, especialmente cuando
˘ la
ˇ velocidad
Ł es un factor importante (sorting, hashing)
• Procedimientos que involucren cálculos matemáticos pesados,
en especial los que involucren aritmética de punto flotante
• Portabilidad (utilizar C en su lugar)
• Aplicaciones complejas donde se requiere
programación estructurada (typechecking, prototipos de
funciones)
• Aplicaciones muy críticas
• 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 E / S a través de puertos o sockets
• Aplicaciones de código-cerrado (Los shell scripts son necesariamente Open
Source)

Capacitación ® 2005 KIT Ingeniería Electrónica SRL 148

También podría gustarte