Вы находитесь на странице: 1из 30

Shell Scripting - Introducción

Enrique Verdes
SysAdmin
2do. Debian Day UyLUG
Breve presentación: Quien es El G@llego?

● Programador por formación, SysAdmin por


deformación.
● Certificado LPIC-1. 10 años de experiencia
usando Linux.
● Socio fundador del UyLUG.
● Miembro de varias asociaciones: Hispalinux,
IEEE, Computer Society.
● Profesor Adjunto de Administración de Sistemas
GNU/Linux en la Universidad ORT.
El shell interactivo
● El shell es un ambiente de programación capaz de
automatizar casi cualquier cosa en su sistema
Linux.
● Una vez iniciado presenta un prompt ($ ó #) para
indicar que está listo para recibir instrucciones
por la entrada estándar (usualmente el teclado).
● El shell de uso más común en Linux es bash,
pero existen otros.
● El shell puede ser cualquier aplicación de
usuario.
¿Que nos ofrece el shell?
● El shell provee:
– Una interfase interactiva textual al sistema operativo.
– Un ambiente operacional.
– Facilidades para iniciar y administrar comandos y
programas.
– Un lenguaje de programación.
Un script muy sencillo...
#!/bin/bash
clear
echo Hola Mundo
... lo complicamos con variables
#!/bin/bash
clear
SALUDO="Hola Mundo"
echo $SALUDO
Variables
● De ambiente: Variables globales. Son pasadas a
todos los procesos iniciados por el shell,
incluyendo otros shells. Esto significa que los
procesos hijo heredan el ambiente. Por
convención se expresan en mayúsculas.
● De shell: Son variables locales. So específicas al
shell corriente y no son heredadas por procesos
hijo. En bash, las variables de shell pasan a ser
de ambiente cuando son exportadas.
Variables de ambiente
● Muchas de las variables son necesarias para la
ejecución de programas.
● Para que esas variables esten disponibles deben
ser exportadas para convertirlas en variables de
ambiente.
$ export MIVAR
● Para listar las variables de ambiente:
$ env
Un poquito mas complicado ...
#!/bin/bash
HOLA=Hola
function hola {
local HOLA=Mundo
echo $HOLA
}
echo $HOLA
hola
echo $HOLA
Ahora con sustitución de
comandos.
#!/bin/bash
HOLA="Hola, hoy es el día $(date +
%j) del año."
echo $HOLA
Estructuras condicionales if ..
then
#!/bin/bash
...
if [ !$# ]; then
echo “Hay parametros”
fi
...
Condicional if .. then .. else
#!/bin/bash
...
if [ $(whoami) = root ]; then
return 0
else
return 1
fi
...
Condicional if .. then .. elif
#!/bin/bash
...
if [ $USER = root ]; then
echo “El usuario es root”
elif [ $(whoami) = gallego ]; then
echo “El usuario es El G@llego”
else
echo “Vos quien sos?”
fi
...
Ahora un ejemplo con
argumentos.
#!/bin/bash
FILE= $1
if [ -f $FILE ]; then
echo el archivo $FILE existe
else
echo archivo no encontrado
fi
Ciclos: for, while y until
● El for es distinto a los de otros lenguajes de
programación. Básicamente, le permite iterar sobre una
serie de `palabras' contenidas dentro de una cadena.
● El while ejecuta un trozo de código si la expresión de
control es verdadera, y termina cuando es falsa (o se
encuentra una interrupción explícita dentro del código
en ejecución).
● El until es casi idéntico al while, excepto en que el
código se ejecuta mientras la expresión de control se
evalúe como falsa.
Ejemplo de for...
#!/bin/bash
for i in $( ls ); do
echo item: $i
done
Ejemplo de while...
#!/bin/bash
CONTADOR=0
while [ $CONTADOR -lt 10 ]; do
echo El contador es $CONTADOR
let CONTADOR=CONTADOR+1
done
Ejemplo de until...
#!/bin/bash
CONTADOR=20
until [ $CONTADOR -lt 10 ]; do
echo CONTADOR $CONTADOR
let CONTADOR-=1
done
La instrucción case...
case $USER; in
root)
echo “Usuario es root”;;
gallego)
echo “Usuario es el G@llego”;;
*)
echo “Y este quien es?”;;
esac
Un pequeño ejemplo.
case "$1"; in
*start)
;;
*)
gprintf "Usage: %s\n" "$(basename $0)
{start}"
exit 1 ;;
esac
Ingresando información...
#!/bin/bash
echo Por favor, introduzca su nombre:
read NOMBRE
echo "¡Hola $NOMBRE!"
Uso de argumentos...
● $0 : Nombre del programa ó script.
● $# : Cantidad de argumentos.
● $1..$n : Argumentos según su posición en la línea
de comandos.
● $@ : Lista de argumentos.
● $? : Resultado de la ejecución del ultimo
comando.
● $$ : PID del shell actual.
Ejemplo de script con argumentos.

#!/bin/bash
if [ $# -ne 1 ]; then
echo uso: $0 archivo
exit 1
elif [ -f $1 ]; then
echo el archivo $1 existe
else
echo archivo no encontrado
fi
Operadores de cadenas de texto
● [ s1 = s2 ]: s1 coincide con s2
● [ s1 != s2 ]: s1 no coincide con s2
● [ s1 < s2 ]: s1 es alfabéticamente anterior a s2,
con el locale actual
● [ s1 > s2 ]: s1 es alfabéticamente posterior a s2,
con el locale actual
● [ -n s1 ]: s1 no es nulo (contiene uno o más
caracteres)
● [ -z s1 ] : s1 es nulo
Operadores aritmeticos
● + (adición)
● - (sustracción)
● * (producto)
● / (división)
● % (módulo)
● ** (exponenciación)
Operadores relacionales
aritmeticos
● [ a -lt b ] equivale a ((a < b))
● [a -gt b ] equivale a ((a > b))
● [a -le b ] equivale a ((a <= b))
● [a -ge b ] equivale a ((a >= b))
● [a -eq b ] equivale a ((a == b))
● [a -ne b ] equivale a ((a != b))
Operadores lógicos
● && Y lógico (AND)
● || O lógico (OR)
Operadores sobre archivos
–d archivo: Verdadero si archivo existe y es un directorio
–e archivo: Verdadero si archivo existe
–f archivo: Verdadero si archivo existe y es un archivo común
–L archivo: Verdadero si archivo existe y es un enlace
simbólico
–r archivo: Verdadero si archivo existe y puede leerse
–s archivo: Verdadero si archivo existe y tiene tamaño mayor
que 0
–w archivo: Verdadero si archivo existe y es escribible
–x archivo: Verdadero si archivo existe y es ejecutable
arch1 -ot arch2: Verdadero si arch1 es más viejo que arch2
Algunos ejemplos prácticos

● Confección de Manual
● Usuario que usa más espacio en disco
● Archivos con bit SUID
Para ampliar estos temas

“Bash Guide for Begginers” - Matchtelt Garrels


http://www.tldp.org/LDP/Bash-Beginners-Guide/html/index.html

Visiten el Proyecto de Documentación de Linux


http://www.tldp.org