Publicado el 26 de Mayo del 2019
778 visualizaciones desde el 26 de Mayo del 2019
378,7 KB
46 paginas
Creado hace 15a (22/04/2010)
Scripts de Shell
Listas
Más herramientas
filtros y regexp
Tema 7: Shell Scripting
Enrique Soriano
Laboratorio de Sistemas,
Grupo de Sistemas y Comunicaciones,
URJC
22 de abril de 2010
Scripts de Shell
Listas
Más herramientas
filtros y regexp
Algunos derechos reservados. Este trabajo se entrega bajo la licencia Creative Commons Reconocimiento -
NoComercial - SinObraDerivada (by-nc-nd). Para obtener la licencia completa, véase
http://creativecommons.org/licenses/by-sa/2.1/es. También puede solicitarse a Creative Commons, 559 Nathan
(cc) 2010 Grupo de Sistemas y Comunicaciones.
Abbott Way, Stanford, California 94305, USA.
Scripts de Shell
Listas
Más herramientas
filtros y regexp
¿Cuándo hago un script de Shell?
• Pasos para realizar una tarea:
1. Mirar si hay alguna herramienta que haga lo que queremos →
2. Si no encontramos, intentar combinar distintas herramientas
buscar en el manual.
→ programar un script de Shell.
IDEA: combinar herramientas que hacen bien una única tarea
para llevar a cabo tareas más complejas.
3. Si no podemos, hacer una herramienta → programar en C (u
otro lenguaje).
Scripts de Shell
Listas
Más herramientas
filtros y regexp
Un script:
• Tiene que acabar en una nueva de línea.
• Tiene que tener permisos de ejecución.
• El comando built-in exit sale del script con el status indicado
en su argumento. Si no se le especifica, sale con el valor de
$status.
term % cat holamundo
#!/bin/rc
echo Hola mundo
exit ’’
term %
Scripts de Shell
Listas
Más herramientas
filtros y regexp
Listas
• Cada elemento es una string (acabada en un caracter nulo).
• La llamada getenv() reemplaza los nulos por un espacio
(menos el último).
Scripts de Shell
Listas
Más herramientas
filtros y regexp
Listas
term % x=(hola que tal)
term % x=(hola (que tal))
term % x=((hola que) (tal)) # es lo mismo!
term % echo $x(2) # el índice empieza en 1!
term % echo $#x # no de elementos
term % cat /env/x
term % xd -c /env/x
Scripts de Shell
Listas
Más herramientas
filtros y regexp
Argumentos de un script
• $*
Lista con todos los argumentos.
• $#*
Número de argumentos (elementos de $*).
• $1,$2,..
Primer argumento, segundo...
• $0
Nombre del programa
Scripts de Shell
Listas
Más herramientas
filtros y regexp
Variables especiales
• $home
• $pid
• $apid
• $prompt
• $path
• $status
• $ifs
Scripts de Shell
Listas
Más herramientas
filtros y regexp
Operador de concatenación
term % z=$aˆ$b
• Si $#a es igual que $#b, se concatena el enésimo elemento de
$a con el enésimo de $b.
• Si es una cadena o una lista de un único elemento, concatena
ese elemento con todas (distribución).
• Si el número de elementos es distinto y mayor que uno, o
alguna lista está vacía: error.
term % chmod +x ’/un/path/largo/’ˆ(file1 file2)
Scripts de Shell
Listas
Más herramientas
filtros y regexp
De lista a cadena
• $"var
Se sustituye por una única cadena con todos los elementos de
$var concatenados. Por tanto, el número de elementos es 1.
term % var=(uno dos tres)
term % b=$"var
term % echo $var $b
term % echo $#var $#b
term % cat /env/var /env/b
term % xd -c /env/var /env/b
Scripts de Shell
Listas
Más herramientas
filtros y regexp
Variables vacías
• lista vacía = variable con una string vacía
term % var1=()
term % var2=’’
term % echo $#var1 $#var2
term % echo $var1 $var2
Scripts de Shell
Listas
Más herramientas
filtros y regexp
Más vale prevenir...
• rfork(1) es un built-in que permite configurar el proceso en el
que ejecuta el script.
• Padre e hijo comparten cosas por defecto: espacio de nombres
y entorno, entre otras.
• rfork n → nuevo espacio de nombres, copiado del padre.
• rfork N → nuevo espacio de nombres, limpio.
• rfork e → nuevo entorno, copiado del padre.
• rfork E → nuevo entorno, limpio.
#!/bin/rc
rfork e # casi siempre queremos esto
...
Scripts de Shell
Listas
Más herramientas
filtros y regexp
Operaciones aritméticas
• La Shell no sabe nada sobre números.
• hoc(1) es potente para cálculos con coma flotante, tiene un
lenguaje parecido a C, constantes definidas (PI, PHI, E)...
• bc(1) es otra calculadora, más cómoda para cambiar de bases
(ibase y obase).
term % echo ’7 + 4’ | hoc
term % echo ’7 + 4’ | bc
term % result=‘{echo ’7 + 4’ | bc}
term % echo ’obase=16 ; 77 ’ | bc
Scripts de Shell
Listas
Más herramientas
filtros y regexp
Test
También nos permite
• Comparaciones
• Comprobar si existen ficheros y directorios
• Comprobar permiso para leer, escribir y ejecutar
Scripts de Shell
Listas
Más herramientas
filtros y regexp
Constructor de agrupaciones
• {...}
Los comandos se ejecutan como si fuera un único comando.
term % { echo hola ; echo adios } > /tmp/afile
term % { echo hola ; echo adios } | tr o O
term % { sleep 100 ; echo tiempo } &
Scripts de Shell
Listas
Más herramientas
filtros y regexp
Subshell
• @{...}
Los comandos se ejecutan en un nuevo shell.
term % @{ cd /sys/src/cmd ; 8c -FVw ls.c}
Scripts de Shell
Listas
Más herramientas
filtros y regexp
For
• for ( var in lista ) {...}
Se itera por cada elemento en la lista. En n-ésima iteración,
$var contendrá el n-ésimo elemento de la lista.
term % for (i in a b c ) { echo elemento: $i }
term % for (i in ‘{ ls } ) { echo entrada: $i }
term % for (i in ‘{ seq 1 10 } ) { echo contador: $i }
Scripts de Shell
Listas
Más herramientas
filtros y regexp
If
• if ( comando ) {...}
if not {...}
Se ejecutan los comandos si el comando acaba con un estatus
correcto. En otro caso, se ejecutan los comandos del if not.
No puede haber un if not sin if.
term % if ( test -f fich.txt ) { echo si existe } ; if
not { echo no existe }
Scripts de Shell
Listas
Más herramientas
filtros y regexp
Comparación de cadenas
cadena patrón ...
• ~
• Compara la cadena con cada patrón. Si algún patrón coincide
con la cadena, el status será correcto. En otro caso, el status
será erróneo.
• No confundir con globbing: no se intenta encajar el patrón
con los nombres de los ficheros.
• Para el patrón: * ? []
• Si cadena es una lista, se pasa a una string.
term % if ( ~
term % if ( ~
$var fich1.txt ){echo var es fich1.txt}
$var *.txt *.pdf){echo acaba en .txt o en .pdf}
Scripts de Shell
Listas
Más herramientas
filtros y regexp
Negación
• ! comando
Si el status fue correcto, se cambia a erróneo, y viceversa.
term % if (! ~
$var *.txt)
{
}
echo var no acaba en .txt
Scripts de Shell
Listas
Más herramientas
filtros y regexp
Switch
• switch( cadena ){
case patron1; ...;
case patron2 ; ....
}
Se ejecutan todos los comandos que correspondan al primer
patrón con el que encaje la cadena.
term % switch( $var ){
case *.txt
echo acaba en .txt
case *.pdf
echo acaba en .pdf
case *
}
echo acaba en otra cosa
Scripts de Shell
Listas
Más herramientas
filtros y regexp
And y Or
• comando1 && comando2 && ...
Se ejecuta el siguiente comando si el actual acaba con un
status correcto. Al final el status es un AND de todos.
• comando1 || comando2 || ...
Se ejecuta el siguiente comando si el actual acaba con status
incorrecto. Al final, el status es un OR de todos.
term % if ( test -f file1 && test -d dir1 )
{ echo existen }
term % test -f file1 && test -d dir1 && echo existen
Scripts de Shell
Listas
Más herramientas
filtros y regexp
While
• while ( comando ) { ... }
Se itera mientras que el comando salga con status correcto.
term % while ( test -f /tmp/file ){
echo /tmp/file sigue existiendo
sleep 10
}
term % while ( sleep 1 ){
# sleep siempre sale bien!!!
cat /tmp/file
}
Scripts de Shell
Listas
Más herramientas
filtros y regexp
Filtros útiles
• sort
ordena las líneas de varias formas.
• uniq
elimina líneas contiguas repetidas.
• tail
muestra las últimas líneas.
P. ej: term % ps | tail +3 # a partir de la 3a
term % ps | tail -3 # las 3 ultimas
term % seq 1 1000 | sort
term % seq 1 1000 | sort -n
Scripts de Shell
Listas
Más herramientas
filtros y regexp
Tr
• Traduce caracteres. El primer argumento es el conjunto de
caracteres a traducir. El segundo es el conjunto al que se
traducen. El enésimo carácter del primer conjunto se traduce
por el enésimo carácter del segundo.
• -d
Borra los caracteres del único conjunto que se le pasa como
argumento.
• Se le pueden dar rangos, p. ej.
term % cat fichero | tr a-z A-Z
Scripts de Shell
Listas
Más herramientas
filtros y regexp
Expresiones regulares (regexp)
• Es un lenguaje formal para describir/buscar cadenas de
caracteres.
• Parecidas a los patrones de la Shell o de globbing, pero más
potentes.
• Una string encaja con sí misma, por ejemplo ’a’ con ’a’.
Scripts de Shell
Listas
Más herramientas
filtros y regexp
Expresiones regulares (regexp)
• .
encaja con cualquier carácter, por ejemplo ’a’.
• [conjunto]
encaja con cualquier carácter en el conjunto, por ejemplo
[abc] encaja con ’a’. Se pueden especificar rangos, p. ej.
[a-zA-Z].
• [ˆconjunto]
encaja con cualquier carácter que no esté en el conjunto, por
ejemplo [ˆabc] NO encaja con ’a’, sin embargo sí encaja
con ’z’.
Scripts de Shell
Listas
Más herramientas
filtros y regexp
Expresiones regulares (regexp)
• ˆ
encaja con principio de línea.
• $
encaja con final de línea.
• Una regexp e1 concatenada a otra regexp e2, e1e2, encaja con
una string si una parte p1 de la string encaja con e1 y otra
parte contigua, p2, encaja con e2.
P. ej:
’az’ encaja con la regexp [a-d]z
Scripts de Shell
Listas
Más herramientas
filtros y regexp
Expresiones regulares (regexp)
• exp*
encaja si aparece cero o más veces la regexp que lo precede.
• exp+
encaja si aparece una o más veces la regexp que lo precede.
P. ej:
’aaa’ encaja con la regexp a*
’baaa’ encaja con la regexp ba+
’bb’ encaja con la regexp ba*
’bb’ no encaja con la regexp ba+
Scripts de Shell
Listas
Más herramientas
filtros y regexp
Expresiones regulares (regexp)
• exp?
enc
Comentarios de: Tema 7: Shell Scripting (0)
No hay comentarios