02 ShellScripts
02 ShellScripts
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
-------------------------------------------
- Ł
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
Módulo 0
˘ ˇ
Generalidades
Diego
2008-11-03 15:49:35
--------------------------------------------
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
--------------------------------------------
comercial
--------------------------------------------
Módulo 1
˘ ˇ
Introducción
Diego
2008-11-03 15:49:44
--------------------------------------------
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
--------------------------------------------
Diego
➎ Se realizan redireccionamientos, eliminando operadores
y operandos de redirección
2008-11-03 15:49:52
-------------------------------------------
- Ł Ł
Diego
2008-11-03 15:50:09
--------------------------------------------
Ł
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
˘ ˇ
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
--------------------------------------------
Caracteres especiales
• Conocidos también como metacaractes
˘ ˇ
• Los metacaracteres poseen significado especial para el shell
• 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
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
--------------------------------------------
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
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
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
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'
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
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 = \
--------------------------------------------
Ejemplos combinados
ec o c- 1250.**S; (update?) [y|n]
$ echo
˘ ˇ
\<-\$1250.\*\*\>\; \(update\?\) \[y\|n\]
$ echo '<-$1250.**>; (update?) [y|n]'
Diego
2008-11-03 15:50:52
--------------------------------------------
Módulo 3
˘ ˇ
Variables
Diego
2008-11-03 15:50:56
--------------------------------------------
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))
• 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
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
--------------------------------------------
• 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
--------------------------------------------
'
_: 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
--------------------------------------------
Variables enteras
• Las variables enteras en Bash son enteros con signo (32 bits)
˘ ˇ
• Posibilidad de overflow
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
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
--------------------------------------------
Comando set
• El comando set despliega las variables de shell junto a sus
˘
valores
ˇ
• 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
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
--------------------------------------------
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
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.
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 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)
Operadores misceláneos
• Operador coma
- Permite encadenar dos o más operaciones aritmética
˘ ˇ
• Ejemplos:
let "t1 = ((5 + 3, 7 - 1, 15 - 4))"
ec o "t1 = t1"
t1 = 11
Módulo 5
˘ ˇ
Construcciones
condicionales
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
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
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
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
--------------------------------------------
Módulo 7
˘ ˇ
Funciones
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
--------------------------------------------
• Nota:
funcion puede definir una variable
local
denominada var1, pero debe anteponer
la palabra reservada local
local var1
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
f2 # Provoca un error
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”)
Módulo 8
˘ ˇ
Entrada y Salida
Redirecciones
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)
exec 4Scapitulo4.txt
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
--------------------------------------------
●Ejemplos:
PI=3.14159265358979
NRO=1234
Palabra1=Shell
Palabra2=Scripts
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
--------------------------------------------
Ejemplos
cat SS .bas rc
alias ll='ls -lha'
˘ alias
ˇ rm='rm -i'
^D
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
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
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
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...
• 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
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 \)
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" :
'.*@.*\..*']
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
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
Módulo 10
˘ ˇ Ł
Filtros
Filtros
• Comandos que leen alguna entrada, realizan una transformación de
˘
laˇ misŁma o calculan valores mediante esta y escriben alguna salida
Módulo 11
˘ ˇ Ł
Lenguaje awk
Introducción
• Aho - Weinberger - Kernighan
Generalidades
• Forma general
awk 'programa' arc ivo ...
˘ ˇ Ł
Primeros ejemplos
awk '/abc/ {print 0}' arc ivo
˘ ˇ Ł
• Ejemplos:
awk '{print 0}' arc ivo Ξ cat arc ivo
awk '/abc/' arc ivo Ξ grep abc arc ivo
• Como script
awk –f script.awk arc ivo…
• Como ejecutable
#! /bin/awk –f
# Primer script
BEGIN {print
“Hola Mundo”}
Sentencias y líneas
• Cada linea de un program a awk es una sentencia o regla
˘
indepen-
ˇ Ł
diente
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
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
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
--------------------------------------------
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
--------------------------------------------
• Redirecciones
awk '{ print 2 S “lista-telefonos”
print 1 S “lista-nombres” }'
archivo_con_datos
“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
“one-liners” útiles ( 2 / 2 )
• awk 'BEGIN { FS = ":" }
˘ ˇ
{ print 1 | "sort" }' /etc/passwd
Ł
# imprime una lista ordenada de los nombres de usaurio
Ejemplos varios
• awk '{ i = 1 # imprime los primeros tres
w ile (i c= 3) campos # de cada registro
˘ ˇ Ł
{ print i
i++ # i=$i+1
}
}'
PASSWORD_FILE=/etc/passwd
n=1 # Numero de
usuario
Módulo 12
˘ ˇ Ł
Lenguaje sed
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
--------------------------------------------
- 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
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
Módulo 14
˘ ˇ Ł
Conclusiones