Shellprogramming - USalamanca
Shellprogramming - USalamanca
en Shell
Rodrigo Santamaría Vicente
1. Introducción a la shell
2. Programación básica en bash
3. Programación avanzada
4. sed y awk
5. Referencias
Introducción a
la Shell
1.¿Qué es una shell?
2.Tipos de shell
3.Usos de la shell
4.Variables de entorno
¿Qué es una shell?
shell (ʃɛl/) – noun 1.a hard outer covering of an animal, as the hard case of a mollusk,
or either half of the case of a bivalve mollusk.
Shell Gráfica
Shell de Línea de Comandos
Generalmente
con shell nos
referimos a una
CLI de Unix
Gráfica vs Texto
• La más antigua
• No tiene características interactivas
– Historia de comandos
– Autocompletar nombres de ficheros
–…
• No tiene estructuras complejas de
programación
– Funciones
– Case
–…
C Shell (csh)
• Capacidades interactivas
– Pausar/reiniciar procesos
– Historia de comandos
– Operaciones matemáticas
Korn Shell (ksh)
AIX, HP-UX,
mac os X
BSD
POSIX shell
• Sintaxis típica
– comando [-]opciones parámetros
• Opciones: dependen de cada comando y alteran
su funcionamiento
• Parámetros: variables de entrada que necesita el
comando, separadas por espacios
– ps –fu
– ls file.txt
– grep “*.txt” ../folder
Procesamiento secuencial
date
ps
who
ps
date
who
Redirección de E/S
• Asignación: variable=valor
• Acceder al valor: $variable
Variables (II)
• Número de parámetros: $#
• Si tenemos más de 9 parámetros, tenemos que usar
desplazamientos: shift [n]
– Donde n es el número de pasos que desplazamos
– Si no se especifica n, se comporta como shift 1
Gestión E/S: echo
• Salida por consola: echo cadena
Caracteres descripción
especiales
-n Evita el salto de línea
(útil si se espera un parámetro de entrada)
\ Elimina el significado especial del siguiente carácter
“ ” Todo lo que está entre comillas pierde su significado
especial salvo $ y \
‘’ Lo que encierra se toma literalmente
` ` Todo lo que está entre acentos graves se trata como
un comando
echo: secuencias de escape
secuencias descripción
de escape
-e activa la interpretación de secuencias de escape
\a alerta (beep)
\b elimina el carácter anterior (backspace)
\c suprime el salto de línea (como –n)
\n salto de línea
\r retorno de carro
\t tabulador horizontal
\\ barra hacia atrás (\)
echo: códigos de escape
• Ejemplo:
• echo –e “\033[34m Hola”
echo: códigos (ii)
acciones descripción
q gestiona los bloqueos del teclado
0 – apaga todos los bloqueos del teclado
1 – encience el bloqueo de scroll, apaga el resto
2 – enciende el bloqueo de números, apaga el resto
3 – enciende el bloqueo de mayúsculas, apaga el resto
7s Almacena la posición del cursor y sus atributos
8u Recupera la posición del cursor y sus atributos
ojo: 7s y 8u no funcionan en todos los terminales, es más recomentable
usar tput sc y tput rc
H,f Establece la posición del cursor
x;y – posición para el cursor
echo: ejemplos
Gestion E/S: read
Símbolo Descripción
* La expr. reg. anterior aparece 0+ veces
. Cualquier carácter (1 ocurrencia)
.* Cualquier cadena de caracteres
[ … ] Cualquier carácter de los especificados entre
corchetes, o un rango si separados por ‘-’
[a-z] [0-9] [a-z,A-Z] [Tt]
Expresiones regulares (II)
• Extensión POSIX
Símbolo Descripción
? La expr. reg. anterior aparece 0 ó 1 vez
[hc]?at at, hat, cat
+ La expr. reg. anterior aparece 1+ veces
[hc]+at hat, cat, hhat, chat,
__________hcat, ccchat
| Aparece la expr. anterior o la posterior
cat|dog cat, dog
Condiciones
• if lista_condiciones1
• then lista_comandos1
• elif
lista_condiciones2
• then lista_comandos2
•…
• else lista_comandosN
• fi
Test
-eq, = Igual a
-lt Menor que
-gt Mayor que
-le Menor o igual que
-ge Mayor o igual que
Test
Ficheros
-f fich Verdadero si fich existe y es un fichero
Cadenas
-n cad Verdadero si cad no es una cadena nula
-z cad Verdadero si cad sí es una cadena nula
cad1==cad2 Verdadero si las cadenas son iguales
cad1!=cad2 Verdadero si las cadenas son distintas
cad Verdadero si cad existe y no tiene valor nulo
Test
Operadores booleanos
-a AND
-o OR
• Observaciones
– Incluir siempre un espacio despues de [ y antes de ]
– test solo vale para enteros, los reales son truncados al
entero más próximo
Case
• Sintaxis como en C:
– for (( expr1; expr2; expr3 ))
– do
–…
– done
• Ejemplo:
– for (( i = 0 ; i <= 5; i++ ))
do
echo “Hola $i veces"
done
–
While
•while lista_comandos1
•do lista_comandos2
•done
Until
•until lista_comandos1
•do lista_comandos2
•done
Ejemplos while - until
Detalles
– gp [-q] [-d]
directorioDestino
» -q para confirmar la copia de cada fichero
» -d para incluir ficheros en los
subdirectorios
Ejercicios
No olvidar el ;
Alcance y Biblioteca de funciones
operador acción
+, - Suma, resta
\*,/,% Multiplicación, división, resto
=,!=,\>,\>=, Comparación de enteros
\<,\<=
expr
expresión acción
expr c1 : c2 Nº de caracteres en que coinciden c1 y
c2 (pueden ser expresiones regulares)
expr length c1 Nº de caracteres de c1
expr index c1 c Posición de la primera ocurrencia del
carácter c en c1
expr substr c1 Subcadena de c1 que empieza en la
start length
posición start y de longitud length
Ejercicios
• wait [n]
– Espera hasta que el proceso con id n acabe
– Si no es especifica id, espera a que todos los
procesos hijos en background terminen
– “!” da el id del último proceso lanzado en segundo
plano wait $! para esperar por él
• sleep n
– El script se queda bloqueado sin hacer nada durante
n segundos
Depuración
• sh –v script
• Escribe cada linea de código que ejecuta:
$ sh -v suma.sh 4 5
– tot=`expr $1 + $2`
tot=`expr $1 + $2`
– echo $tot expr $1 + $2
echo $tot
9
Depuración de scripts
• sh –x script
• Sustituye cada $var por su valor
• Muestra cada línea de código que se va
ejecutando
– Precedida de +, o de ++ si es un subcomando de la
línea
$ sh -x suma.sh 4 5
– tot=`expr $1 + $2` ++ expr 4 + 5
– echo $tot + tot=9
+ echo 9
9
Programación
avanzada en bash
1. Variables locales y globales
2. Señales
3. getopts
4. Utilidades esenciales
Variables globales y locales
Existen muchas más señales (segmentation fault, bus error, power fail,
etc) , pero generalmente, estas son las que se busca controlar
Señales: ejercicio
• Opciones
opciones descripción
-s elimina espacios en las secuencias encontradas
-c añade pattern2 a pattern1 en vez de sustituirlo
-d elimina pattern1 (no se necesita pattern2)
uniq
• sed -n 's/'$1'/&/g'
• sed -n 's/‘“$1”'/&/g'
restricciones
acciones significado
q quit (terminar la ejecución)
p print (imprime por pantalla la salida de sed)
w write (escribe a fichero la salida de sed)
Ejercicios
…
sintaxis
meta significado
caracter
. Cualquier carácter (uno)
* El carácter anterior aparece 0+ veces
^ Coincide con el comienzo de línea
$ Coincide con el final de línea
\ El carácter siguiente no es metacaracter
[ ] Coincide con alguna de los caracteres entre []
{ } Coincide con la expresión exacta entre {}
+ El carácter anterior aparece 1+ veces
? El carácter anterior aparece 0 ó 1 vez
| Coincide con el patrón a su izquierda o derecha
ejemplos de búsqueda
patrón resultado
/The/ “The”
/^The/ “The Bourne Ultimatum”, “The”, “Thelema"
/The$/ “Bourne Ultimatum, The”, “The”, “Pathe”
/\$/ “$”
/[Tt]he/ “The” “the”
/[a-z]/ “plane” “house” “bourne”
/[a-zA-Z0-9]/ “bourne” “Bourne” “oceanic815”
^[^a-z] “Bourne” “815oceanic”
/{^Germany}/ “Germany” “Germany’s politics …”
ejemplos de búsqueda (ii)
patrón resultado
/wh./ “who” “why” “wh3” …
/wh*/ “w“ “wh” “whh” “whhh” …
/.*/ Cualquier cadena de caracteres
/wh?/ “w” “wh”
/wh+/ “wh” “whh” “whhh” …
/^[+-]?[0-9]+$/ Cualquier entero (con o sin signo)
/^…$/ La línea coincide exactamente
[-+]? Posible signo inicial
[0-9]+ Cualquier cadena de números
acciones
acción descripción
substr(str,start, substr("unforgettable",6,3) “get”
length)
split(str, array split(“jay:bob”,c,”:”)
[,sep])
c[1]=jay, c[2]=bob
index(str, str) index(“gorbachov”, “bach”) 4
index(“gorbachov”, “z”) 0
next salta a la siguiente línea de texto
length(str) devuelve la longitud de la cadena
break, continue, exit Como en shell y C
print y printf
acción descripción
print imprime la linea actual
print imprime “cad1 cad2”
“cad1”,”cad2”
print “cad1” imprime “cad1cad2”
“cad2”
printf() imprime siguiendo la sintaxis de C:
%d, %f, %o, %x
%n.m
\n, \t
variables
• No tienen tipo ni hay que declararlas
• Se asignan como en los programas de la shell
• Variables especiales:
variable descripción
$1, $2, $3… Variable de campo, da el valor de la
columna 1, 2, 3 …
$0 Contiene el valor de toda la línea
NR Número de líneas de entrada
NF Número de columnas
$NF Valor de la última columna
variables especiales (ii)
variable descripción
FILENAME Nombre del fichero de entrada
FS Separador de columnas. Por defecto es
“white space”, refiriéndose a “[ ]“ y “\t”
También se puede modificar con la opción de comando
–F seguido del delimitador (-F:, -F/)
• Tutoriales utilizados
– shell scripting
• http://www.cyberciti.biz/nixcraft/linux/docs/
uniqlinuxfeatures/lsst/
• http://tldp.org/LDP/abs/html/index.html
– sed
• http://www.grymoire.com/Unix/Sed.html#uh-1
– awk
• http://cs.sru.edu/~whit/cpsc207/notes/awkegs.html
• http://www.vectorsite.net/tsawk_1.html#m1
referencias (ii)
• Libros
– Shells: User’s Guide. Hewlett Packard,
1991
– Linux & Unix Shell Programming. David
Tansley
– Portable Shell Programming. Bruce Blinn
– Unix Shell Programming. Stephen G.
Kochan and Patrick H. Wood